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

Jon*_*nno 24 pyinstaller scipy

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

import scipy
Run Code Online (Sandbox Code Playgroud)

然后运行:

python pyinstaller.py --onefile foo.py
Run Code Online (Sandbox Code Playgroud)

当我启动foo.exe时,我得到:

WARNING: file already exists but should not: C:\Users\username\AppData\Local\Temp\_MEI86402\Include\pyconfig.h
Run Code Online (Sandbox Code Playgroud)

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

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

小智 20

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

for d in a.datas:
    if 'pyconfig' in d[0]: 
        a.datas.remove(d)
        break
Run Code Online (Sandbox Code Playgroud)


frm*_*ryr 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"]:


sco*_*ell 7

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

a.datas = list({tuple(map(str.upper, t)) for t in a.datas})
Run Code Online (Sandbox Code Playgroud)

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