我想通过使用pyinstaller
将我的python代码编译为二进制,但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
Then I try:
$ pyinstaller -F example.py --hidden-import=_psutil_linux
仍然是相同的错误。我已经阅读了pyinstall手册,但我仍然不知道如何使用hidden import
。有详细的例子吗?或者至少有一个例子来编译和运行我的example.py
?
env:
- OS: Ubuntu 14.04
- Python: 2.7.6
- pyinstaller: 2.1
希望你还在寻找答案。我是这样解决的:
添加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
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.pyd
和xxx.dll
)。
在Linux中,只需运行:
$ cxfreeze example.py -s --target-dir some_path
,并在some_path
下输出大量文件(xxx.so
)。
cx_freeze
的缺陷是它不会将所有的库包装到目标目录,这意味着你必须在不同的环境下测试你的构建。如果缺少任何库,只需将它们复制到目标目录。一个例外情况是,例如,如果您在Centos 6下构建python,但在Centos 7下运行时,缺少lib .so。你应该在Centos 7和Centos 6下编译你的python。
我是这样做的:
-
安装python-psutil:
sudo apt-get install python-psutil
。如果你以前安装过其他psutil
模块吗方法,例如通过source或easy_install
,先删除它。 -
按原样运行
pyinstaller
,不使用hidden-import
选项
仍然面临错误实现:1.Python程序,包含platform, OS, shutil和psutil等模块当我直接使用python运行脚本时,它工作得很好。
2。如果我使用pyinstaller构建一个二进制文件。二进制文件已成功构建。但是,如果我运行二进制我得到没有模块命名psutil发现。我尝试了几种方法,比如添加隐藏导入和其他东西。没有一个是有效的。我试了差不多2到3天。错误:ModuleNotFoundError:没有名为"psutil"的模块创建二进制文件命令pyinstaller——hidden-import=['_psutil_linux']——onefile——clean serverh .py
i tried -additional-hooks-dir= also not working。当我运行二进制im获取模块没有发现错误