7

我想通过使用将我的 python 代码编译为二进制pyinstaller,但是hidden import阻止了我。例如,以下代码导入psutil并打印 CPU 计数:

# example.py
import psutil
print psutil.cpu_count()

我编译代码:

$ pyinstaller -F example.py --hidden-import=psutil

当我在以下运行输出时dist

ImportError: cannot import name _psutil_linux

然后我尝试了:

$ pyinstaller -F example.py --hidden-import=_psutil_linux

还是同样的错误。我已经阅读了 pyinstall 手册,但我仍然不知道如何使用hidden import. 有没有详细的例子?或者至少是一个编译和运行我的示例example.py

环境变量:

  • 操作系统:Ubuntu 14.04
  • 蟒蛇:2.7.6
  • 安装程序:2.1
4

4 回答 4

6

嗨,希望你还在寻找答案。这是我解决它的方法:

添加一个名为hook-psutil.py

from PyInstaller.hooks.hookutils import (collect_data_files, collect_submodules)

datas = [('./venv/lib/python2.7/site-packages/psutil/_psutil_linux.so', 'psutil'),
         ('./venv/lib/python2.7/site-packages/psutil/_psutil_posix.so', 'psutil')]
hiddenimports = collect_submodules('psutil')

然后打电话pyinstaller --additional-hooks-dir=(the dir contain the above script) script.py

于 2015-07-24T13:28:59.707 回答
0

pyinstall很难配置,cx_freeze也许更好,都支持windows(你可以exe直接下载)和linux。提供example.py, 在 windows 中,假设您已经在默认路径 ( C:\\Python27) 中安装了 python:

$ python c:\\Python27\\Scripts\\cxfreeze example.py -s --target-dir some_path

cxfreeze是一个python脚本,你应该运行它python,然后构建文件在下面some_path(有很多xxx.pydxxx.dll)。

在 Linux 中,只需运行:

$ cxfreeze example.py -s --target-dir some_path

并且还输出了很多文件(xxx.so)下some_path

缺点cx_freeze是它不会将所有库包装到目标目录,这意味着您必须在不同的环境下测试您的构建。如果缺少任何库,只需将它们复制到目标目录即可。一个例外情况是,例如,如果你在 Centos 6 下构建你的 python,但是在 Centos 7 下运行时,会抛出 libc.so.6 的缺失,你应该在 Centos 7 和 Centos 6 下编译你的 python。

于 2015-07-09T09:14:52.487 回答
0

对我有用的方法如下:

  1. 安装 python-psutil: sudo apt-get install python-psutil。如果您以前psutil通过其他方法(例如通过 source 或 )安装了模块easy_install,请先将其删除。

  2. pyinstaller像你一样运行,没有hidden-import选项。

于 2015-08-11T07:59:50.813 回答
-1

仍然面临错误实施:1.python 程序,当我直接使用 python 运行脚本时,它工作正常。

2.如果我使用 pyinstaller 构建二进制文件。二进制文件已成功构建。但是,如果我运行二进制文件,我会得到名为 psutil 的 No 模块。我尝试了几种方法,例如添加隐藏导入和其他内容。没有工作。我尝试了将近 2 到 3 天。 错误: ModuleNotFoundError: No module named 'psutil' 命令用于创建二进制 pyinstaller --hidden-import=['_psutil_linux'] --onefile --clean serverHW.py

我试过 --additional-hooks-dir= 也不起作用。当我运行二进制我得到模块未找到错误。

于 2021-01-07T04:35:33.807 回答