在 parmap 上使用 pyinstaller 会导致 tkinter matplotlib 导入错误。为啥?

Posted

技术标签:

【中文标题】在 parmap 上使用 pyinstaller 会导致 tkinter matplotlib 导入错误。为啥?【英文标题】:Using pyinstaller on parmap causes a tkinter matplotlib import error. Why?在 parmap 上使用 pyinstaller 会导致 tkinter matplotlib 导入错误。为什么? 【发布时间】:2017-01-01 07:16:29 【问题描述】:

更新

如果我尝试从 Pyinstaller 3.2 降级到 3.1,我会在尝试运行可执行文件时得到以下回溯。

我尝试将--hidden-import=collect_submodules('pkg_resources._vendor') 添加到 pyinstaller,如此处所述,但没有效果。同样的错误。这似乎是由于 setuptools 的问题。我正在使用 26.0.0。降级到 19.3,许多消息来源说修复了这个问题确实解决了这个问题,但我又回到了下面的问题。


我有一个 python 2.7 pyqt4 项目,我正在尝试使用 pyinstaller 将其转换为 .exe。我用:

pyinstaller --additional-hooks-rir=. --clean --win-private-assemblies pipegui.py

pipegui.py 可以在github上找到here

我得到了一个可以运行的可执行文件,并且该应用程序似乎可以正常运行。 Here 是 pyinstaller 冻结时终端吐出的内容。但是,当我运行程序的特定部分时,应用程序会崩溃。它崩溃了,终端进入一个循环,不断在下面输出相同的回溯,顶部的“Poolworker-X”不断增加:

正如你所见,tkinter 被牵连,尽管“tkinter”这个词在我的项目中没有出现(使用 pyqt4)。我正在使用 matplotlib,并且从讨论的答案 here 和 here 我已将以下内容添加到 pipegui.py 我的主脚本的顶部:

    from Tkinter import * 
    import Tkinter
    import FileDialog

然而,这似乎是朝错误方向迈出的一步,因为在使用这个(以及与以前相同的标志)冻结后,我的可执行文件甚至无法打开,而是得到了这个:

Here 是 pyinstaller 在冻结时几乎相同的输出。请记住,我所做的只是在上面添加了这 3 个导入语句。就是这样。

我也尝试了 pyinstaller --additional-hooks=. --clean --win-private-assemblies --hidden-import=Tkinter pipegui.py 并没有什么不同。我完全不明白为什么尝试导入 tkinter 会这样做。修复这个回溯会让我更接近解决另一个问题吗?

我在尝试了所有这些之后才发现,我的可执行文件中唯一崩溃的部分是使用parmap 多处理的部分。使用 matplotlib 但不使用 parmap 的类工作正常。

所以请注意我的问题是如何修复第一个回溯,以及为什么 matplotlib 和 tkinter 都在回溯中弹出,尽管我的代码使用 niether 发生崩溃?

补充说明

我使用--clean --win-private-assemblies 修复error code 14001 按照here

【问题讨论】:

如果您使用的是pyinstaller 3.2,download the latest development version,然后再试一次。你也可以降级到3.1 据我所知 3.2 是最新版本,所以我假设您的意思是“如果您不使用 pyinstaller 3.2”。当我尝试pip install -e https://github.com/pyinstaller/pyinstaller/archive/develop.zip 我得到https://github.com/pyinstaller/pyinstaller/archive/develop.zip should either be a path to a local project or a VCS url beginning with svn+, git+, hg+, or bzr+ 我降级到3.1。现在尝试运行 .exe 时出现全新的 ImportError(使用 3.2 会打开 .exe)。查看有问题的更新。 所以一个小时后,我尝试 pip install github.com/pyinstaller/pyinstaller/archive/develop.zip 代替(所以根据 pyinstaller 网站没有 -e 标志)。这将安装开发人员版本,就像修复所有内容一样。如果你把你的解决方案放在下面,我当然会接受。 很高兴听到它奏效了。我从未使用过-e 开关,老实说我从未注意到它(哎呀)。我认为开发版本无需额外输入即可工作,但对于3.1,您需要添加它们(虽然不是 100% 肯定)。如果你有PIL in your code,那么只有开发版本对我有用。稍后我会在下面发布答案。 【参考方案1】:

Repiklis 在 cmets 中提供了解决方案。进一步注意,截至 2017 年 1 月 15 日,Pyinstaller 版本 3.2.1 已发布。我现在使用它,它与 this 和 this 等其他问题一起解决了这个问题,我以前只能通过使用开发人员版本来解决。因此,如果您还没有升级到最新版本,我强烈建议您升级。

【讨论】:

以上是关于在 parmap 上使用 pyinstaller 会导致 tkinter matplotlib 导入错误。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

pyinstaller安装和使用

在 python 脚本上使用 pyinstaller 会产生巨大的文件大小

无法在 Linux 上使用 pyinstaller 和 cefpython 创建可执行文件(ICU 数据的文件描述符无效)

Pyinstaller 一切都在本地机器上运行,但在另一台机器上失败

在 macOS 和 Windows 上使用 PyInstaller 编译时,简单的 PyQt5 GUI 看起来像 GTK

pyinstaller打包在别的电脑上无法运行?