【问题标题】:Pyinstaller --onefile warning pyconfig.h when importing scipy or scipy.signalPyinstaller --onefile 在导入 scipy 或 scipy.signal 时警告 pyconfig.h
【发布时间】:2013-10-04 00:09:22
【问题描述】:

这很容易重新创建。 如果我的脚本 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 人员提交了一张票,但还没有听到任何消息。任何线索如何进一步调试?

【问题讨论】:

  • PyInstaller 3.4 不会出现这个问题

标签: scipy pyinstaller


【解决方案1】:

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

for d in a.datas:
    if 'pyconfig' in d[0]: 
        a.datas.remove(d)
        break

【讨论】:

  • 遗憾的是,这种解决方法对我不起作用。它摆脱了“文件已存在”错误,但现在 --onefile 可执行文件只是崩溃而没有任何警告。我会再摆弄一下,看看我是否无法弄清楚。
  • @dthor,你有没有解决这个问题?我似乎被困在同一个地方。
【解决方案2】:

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"]:

【讨论】:

【解决方案3】:

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

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

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

【讨论】:

  • 您的建议在 Windows 上有效,但在 linux 上失败。仅供参考。
  • 我不确定,但我认为这个问题甚至不会发生在 Linux 上,所以你不需要解决方案。你在 Linux 上遇到过这个问题吗?
【解决方案4】:

我意识到问题在于 Windows 不区分大小写,这 2 条语句是源目录是“重复的: 包括\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 个测试中有效。

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

【讨论】:

    【解决方案5】:

    我在我自己的一个 --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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      • 2018-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      相关资源
      最近更新 更多