任何关于psutil隐藏导入的pyinstaller详细示例



我想通过使用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.pydxxx.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。

我是这样做的:

  1. 安装python-psutil: sudo apt-get install python-psutil。如果你以前安装过其他psutil模块吗方法,例如通过source或easy_install,先删除它。

  2. 按原样运行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获取模块没有发现错误

相关内容

最新更新