随笔 - 934, 文章 - 0, 评论 - 249, 阅读 - 345万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

pyinstaller 编译踩的坑

Posted on   蝈蝈俊  阅读(1191)  评论(0编辑  收藏  举报

这两天连续踩了 pyinstaller 的坑,表现就是代码执行没问题,但是编译后程序执行各种卡顿,错误问题。

事后分析主要是碰到了下面两类问题。

PyInstaller 不能自动检测到的依赖

一些情况下,PyInstaller 无法检测到某个依赖,继而打包出来的执行文件执行时,就会报错误:

No module named '***'

解决方法, 使用 --hidden-import 参数。它用于指定那些 PyInstaller 不能自动检测到的依赖。换句话说,这些是在你的代码中没有直接 import 的模块,但你的程序的运行仍然依赖于它们。

pyinstaller --hidden-import=pkg_resources.py2_warn myscript.py

pkg_resources.py2_warn 就是一个 "hidden import"。

通过这个参数,我们告诉 PyInstaller 在构建 myscript.py 的可执行文件时,也包含 pkg_resources.py2_warn 这个模块。

如果你有多个 hidden import,你可以多次使用 --hidden-import 参数:

pyinstaller --hidden-import=pkg_resources.py2_warn --hidden-import=another_module myscript.py

按照https://stackoverflow.com/questions/57227191/pyinstaller-hidden-import-not-found 这里的说法,需要 hidden-import 参数放在pyinstaller 命令的前面,以确保它们被正确地传递给 pyinstaller。

pyinstaller --hidden-import copy_image_util --hidden-import openpyxl.cell._writer --hidden-import win32clipboard -F Facebook自动化工具.py -i icon.ico --noconsole

--hidden-import 参数可以导入一个py文件模块么?

--hidden-import 参数用于指定在你的程序中未明确导入但运行时仍然需要的模块。这个参数的目标是模块名,而不是文件名。也就是说,你不能直接指定 .py 文件路径,而是需要指定模块名。例如,如果你的 extra.py 文件在 Python 的搜索路径(sys.path)中,你可以通过指定模块名 "extra" 来使用 --hidden-import 参数:

pyinstaller --hidden-import=extra myscript.py

这仅适用于在 Python 的搜索路径(sys.path)中的模块。如果 extra.py 文件位于其他位置,你可能需要将其所在的目录添加到 Python 的搜索路径中,或者移动 extra.py 文件到一个已经在搜索路径中的目录。

Python 的搜索路径包括当前工作目录、Python 安装目录、PYTHONPATH 环境变量中的目录,以及通过 sys.path.append() 添加的目录。

如果你的模块在一个包(package)内部,你需要使用完整的包路径,如 package.subpackage.module。例如:

pyinstaller --hidden-import=package.subpackage.extra myscript.py

类似的典型问题:

少对应的执行dll文件

比如我们 import win32clipboard 后, 我们可能会碰到 "ImportError: DLL load failed: 找不到指定的模块"的错误。

解决方案,把对应的dll放到执行目录下。

比如:下面两个dll是剪切板相关操作的dll,发帖时会用到。

  • pythoncom310.dll
  • pywintypes310.dll

当出现 ImportError: DLL load failed while importing win32clipboard: 找不到指定的模块,就是少这两个文件。

需要将在当前目录下包含下面两个文件,或者放入系统目录。

参考:

相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2012-05-25 iOS 应用是如何创建的
2012-05-25 XCode 4.3.2 如何新建 Window-based Application应用的简单例子
2010-05-25 .NET Framework 4.0 SDK的安装
点击右上角即可分享
微信分享提示