Подтвердить что ты не робот

Pyinstaller - однофайльное предупреждение pyconfig.h при импорте scipy или scipy.signal

Это очень просто воссоздать. Если мой script 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-e958e02, работающий на Win7, Python 2.7.5 (32 бит), Scipy version 0.12.0

Я отправил билет с людьми Pyinstaller, но ничего не слышал. Любые подсказки, как отлаживать это дальше?

4b9b3361

Ответ 1

Вы можете взломать файл спецификации, чтобы удалить второй экземпляр, добавив эти строки после a = Анализ:

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

Ответ 2

Ответ 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"]:

Ответ 3

Расширяясь при решении Ilya, я думаю, что это немного более надежное решение для модификации файла spec (опять же после оператора a = Analysis...).

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

Я тестировал это только в небольшой тестовой программе (с одним оператором импорта и печати), но, похоже, это работает. a.datas - это список кортежей строк, содержащих пути pyconfig.h. Я конвертирую их все в нижний регистр, а затем в дедупу. Я фактически обнаружил, что преобразование всех их всех в нижний регистр было достаточным, чтобы заставить его работать, что говорит мне, что pyinstaller делает дезадаптацию с учетом регистра, когда он должен быть чувствителен к регистру в Windows. Тем не менее, я сделал вывод себя для хорошей меры.

Ответ 4

Я понял, что проблема в том, что Windows нечувствительна к регистру, и эти 2 оператора являются исходными каталогами: "duplicates: включают \pyconfig.h Включить\pyconfig.h

Мое решение состоит в том, чтобы вручную настроить файл .spec после вызова a = Analysis():

import platform
if platform.system().find("Windows")>= 0:
    a.datas = [i for i in a.datas if i[0].find('Include') < 0]

Это работало в моих 2 тестах.

Более гибким решением будет проверка всех элементов для нечувствительных к регистру конфликтов.

Ответ 5

Я запустил утилиту archive_viewer.py(из PyInstaller) в одном из моих собственных исполняемых файлов --onefile, которые имеют ту же ошибку и обнаружили, что 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