【问题标题】:Import error when using pyinstaller to create a single exe file使用pyinstaller创建单个exe文件时导入错误
【发布时间】:2018-12-13 00:37:47
【问题描述】:

我有一个涉及多个 python 模块的 python 包。该项目已在 pycharm 中创建。我已经使用 pyinstaller 创建了我的 python 包的单个可执行文件。当我使用批处理文件运行可执行文件时,出现导入错误,特别是 pandas 无法导入。 pyinstaller 没有在我的虚拟环境中收集包依赖项是有原因的吗?

提前感谢您的帮助!

我有以下 2 个错误: (1) ModuleNotFoundError: No module named 'pandas._libs.tslibs.np_datetime'

(2) 文件“site-packages\pandas__init__.py”,第 35 行,在 ImportError:C 扩展:未构建名为“pandas._libs.tslibs.np_datetime”的模块。如果要从源目录导入 pandas,可能需要先运行“python setup.py build_ext --inplace --force”来构建 C 扩展。

【问题讨论】:

  • 您是在询问 pyinstaller 没有从虚拟环境中收集包依赖项的原因,还是如何解决问题?这个我不是很清楚
  • 两者。我想纠正这个问题,但也想知道为什么它没有收集包依赖项。
  • 一个简单的问题,您是否使用命令提示符使用 pyinstaller 构建 exe?
  • 我使用了 anaconda 提示符。

标签: python executable pyinstaller


【解决方案1】:

每个虚拟环境都有一个 pip 脚本。因此,当您安装 python 模块时,它会安装到 projectname\venv\Lib\site-packages 目录中。

当您从终端运行 pyinstaller 以生成可执行文件时,pyinstaller 会检查 Sys.path 中的依赖项。但该路径不包括 projectname\venv\Lib\site-packages 目录。因此 pyinstaller 找不到那些特定的依赖项。在这种情况下,它会给您警告。这些警告可以在您的可执行文件附近的 'warnname.txt' 中找到。

编辑:如何配置 pycharm 以运行 pyinstaller

  1. 首先您需要将 pyinstaller 添加到项目解释器中。
  2. 然后您需要设置运行配置。

    脚本名称: Python 脚本的路径
    工作路径:项目位置

    保留图像中的解释器选项。

  3. 运行 pyinstaller。您可以在 dist 目录中找到您的 .exe

  4. 如果“未找到模块”错误仍然存​​在。您可以添加隐藏的导入钩子并指定缺失模块的名称。导航到

项目路径\venv\Lib\site-packages\PyInstaller\hooks

并创建一个新的 "hook-pandas.py"(hook-modulename.py) 脚本并制作一个这样的隐藏导入模块列表。

hiddenimports = ['pandas._libs.tslibs.np_datetime','pandas._libs.tslibs.nattype','pandas._libs.skiplist']
  1. 然后再次运行 pyinstaller,它现在应该可以工作了。

【讨论】:

  • 很有意义。认为我做错了什么,因为我遇到了类似的错误。我这样做了: pyi-makespec --paths=/path/to/thisdir \ --paths=/=/path/to/otherdir/myscript.py 写 /path/to/workdir/.spec 现在运行 pyinstaller.py 到构建可执行文件(基础) C:\Users\franc\PycharmProjects\test>pyinstaller.py 'pyinstaller.py' 未被识别为内部或外部命令、可运行程序或批处理文件。然后我做了: pyinstaller --onefile myscript.py
  • 当我按照您的指示执行 pyinstaller --onefile myscript.py 时,我仍然收到警告消息。我做错了什么?
  • /path/to/thisdir 表示您要收集的依赖项的路径,之后您必须运行 pyinstaller scriptname.py
  • 因此,当我运行 pyi-makespec 时,我可以检查文件夹中的规范文件,并看到已添加了新的依赖路径,但是当我运行 pyinstaller scriptname.py 时,规范文件被覆盖,因此依赖路径丢失。
  • 我想通了——你需要运行 pyinstaller scriptname.spec。但它仍然无法正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-19
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
相关资源
最近更新 更多