Pyinstaller--导入scipy或scipy.signal时发出pyconfig.h警告的一个文件
这是非常简单的重建。 如果我的脚本foo.py是:Pyinstaller--导入scipy或scipy.signal时发出pyconfig.h警告的一个文件,scipy,pyinstaller,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 我已经测试了几个版本,但我确认的最新版本是2.1dev-e958e0
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
我已经测试了几个版本,但我确认的最新版本是2.1dev-e958e02,运行在Win7、Python 2.7.5(32位)、Scipy 0.12.0版上
我已经向Pyinstaller的人提交了一张罚单,但还没有听到任何消息。有没有进一步调试的线索?我在我自己的一个--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手册链接:
通过在a=Analysis之后添加以下行,您可以破解spec文件以删除第二个实例:
for d in a.datas:
if 'pyconfig' in d[0]:
a.datas.remove(d)
break
扩展Ilya的解决方案,我认为这是修改spec文件(再次放在a=Analysis…语句之后)的更健壮的解决方案
我只在一个小的测试程序(一个只有一个import和print语句的程序)上测试过这个,但它似乎可以工作。a、 数据是包含pyconfig.h路径的字符串元组列表。我将它们全部转换为小写,然后进行重复数据消除。事实上,我发现将它们全部转换为小写就足以让它工作,这对我来说意味着pyinstaller在Windows上应该不区分大小写的时候会进行区分大小写的重复数据消除。然而,我自己做了重复数据消除工作,这是一个很好的衡量标准。wtobia@的回答对我很有用。看
C:\Python27\Lib\site packages\PyInstaller\build.py
def append(self,tpl):
函数如果tpl[2]=“BINARY”:
更改为如果tpl[2]在[“BINARY”,“DATA”]:
我意识到问题在于Windows不区分大小写,这两条语句是源目录,它们是“重复的: include\pyconfig.h Include\pyconfig.h 我的解决方案是在a=Analysis()调用之后手动调整.spec文件:
导入平台
如果platform.system().find(“Windows”)>=0:
a、 datas=[i代表a.datas中的i,如果i[0]。find('Include')<0]
这在我的两次测试中奏效了
一个更灵活的解决方案是检查所有项目是否存在不区分大小写的冲突。遗憾的是,这个解决方案对我不起作用。它去掉了“文件已经存在”的选项错误,但现在--onefile可执行文件在没有任何警告的情况下崩溃。我再摆弄一会儿,看看我是不是弄不明白什么。@dthor,你解决过这个问题吗?你的建议在windows上有效,但在linux上失败了。仅供参考。我不确定,但我认为这个问题甚至不会在Linux上发生,所以您不需要解决方案。你在Linux上遇到过这个问题吗?对我来说非常有魅力!林克死了;也许insteadIt看起来这个问题在开发版本中已经解决了,但是他们从2013年就没有发布过。通过的解决方法对我有效。此问题在PyInstaller 3.4中没有出现此问题在PyInstaller 3.4中没有出现
a.datas = list({tuple(map(str.upper, t)) for t in a.datas})
import platform
if platform.system().find("Windows")>= 0:
a.datas = [i for i in a.datas if i[0].find('Include') < 0]