重新创建非常简单。 如果我的脚本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人提交了一张票,但还没有听到任何消息。任何线索如何进一步调试?
答案 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
C:\Python27\Lib\site-packages\PyInstaller\build.py
def append(self, tpl):
函数。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