25

这很容易重新创建。如果我的脚本 foo.py 是:

import scipy

然后运行:

python pyinstaller.py --onefile foo.py

当我启动 foo.exe 我得到:

WARNING: file already exists but should not: C:\Users\username\AppData\Local\Temp\_MEI86402\Include\pyconfig.h

我测试了几个版本,但我确认的最新版本是在 Win7、Python 2.7.5(32 位)、Scipy 版本 0.12.0 上运行的 2.1dev-e958e02

我已经向 Pyinstaller 的人提交了一张票,但还没有听到任何消息。任何线索如何进一步调试?

4

5 回答 5

21

您可以通过在 a=Analysis 之后添加这些行来破解规范文件以删除第二个实例:

for d in a.datas:
    if 'pyconfig' in d[0]: 
        a.datas.remove(d)
        break
于 2013-10-03T16:06:54.447 回答
15

wtobia@ 的答案对我有用。见https://github.com/pyinstaller/pyinstaller/issues/783

  1. C:\Python27\Lib\site-packages\PyInstaller\build.py
  2. 找到def append(self, tpl):函数。
  3. 更改if tpl[2] == "BINARY":if tpl[2] in ["BINARY", "DATA"]:
于 2014-01-07T16:18:42.033 回答
7

扩展 Ilya 的解决方案,我认为这是修改规范文件的更强大的解决方案(再次位于 a=Analysis... 语句之后)。

a.datas = list({tuple(map(str.upper, t)) for t in a.datas})

我只在一个小型测试程序(一个带有单个导入和打印语句的程序)上对此进行了测试,但它似乎有效。a.datas 是包含 pyconfig.h 路径的字符串元组列表。我将它们全部转换为小写,然后进行重复数据删除。我实际上发现将它们全部转换为小写就足以让它工作,这向我表明 pyinstaller 在 Windows 上应该不区分大小写时会执行区分大小写的重复数据删除。但是,我自己做了重复数据删除。

于 2013-12-20T01:55:44.593 回答
1

我意识到问题是 Windows 不区分大小写,这 2 个语句是源目录是“重复的:include\pyconfig.h Include\pyconfig.h

我的解决方案是在 a=Analysis() 调用之后手动调整 .spec 文件:

import platform
if platform.system().find("Windows")>= 0:
    a.datas = [i for i in a.datas if i[0].find('Include') < 0]

这在我的 2 个测试中有效。

更灵活的解决方案是检查所有项目是否存在不区分大小写的冲突。

于 2015-01-12T23:22:53.283 回答
0

我在我自己的一个具有相同错误的 --onefile 可执行文件上运行了 archive_viewer.py 实用程序(来自 PyInstaller),发现 pyconfig.h 包含两次:

 (31374007, 6521, 21529, 1, 'x', 'include\\pyconfig.h'),
 (31380528, 6521, 21529, 1, 'x', 'Include\\pyconfig.h'),
 (31387049, 984, 2102, 1, 'x', 'pytz\\zoneinfo\\CET'),

可悲的是,我不知道如何解决它。

PyInstaller 手册链接: http ://www.pyinstaller.org/export/d3398dd79b68901ae1edd761f3fe0f4ff19cfb1a/project/doc/Manual.html#archiveviewer

于 2013-09-27T18:58:11.227 回答