Pyinstaller --onefile警告pyconfig.h导入scipy或scipy.signal时

时间:2013-09-27 15:53:41

标签: scipy pyinstaller

重新创建非常简单。 如果我的脚本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上运行的2.1dev-e958e02,Python 2.7.5(32位),Scipy版本0.12.0

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

5 个答案:

答案 0 :(得分:20)

您可以通过在= Analysis:

之后添加这些行来破解spec文件以删除第二个实例
for d in a.datas:
    if 'pyconfig' in d[0]: 
        a.datas.remove(d)
        break

答案 1 :(得分: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"]:

答案 2 :(得分:6)

扩展Ilya的解决方案,我认为这是修改spec文件的一个更强大的解决方案(再次放在a = Analysis ...语句之后)。

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

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

答案 3 :(得分:1)

我意识到问题是Windows不区分大小写,而这两个语句是源目录是"重复: 包括\ pyconfig.h 包括\ 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次测试中起作用。

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

答案 4 :(得分:0)

我在我自己的一个具有相同错误的文件可执行文件上运行了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