PyInstaller, spec-файл, ImportError: нет модуля с именем 'blah'

Я пытаюсь создать скрипт python через PyInstaller. Я использовал следующие команды для настройки, создания файла спецификации и сборки:

wget pyinstaller.zip, extracted it, python Configure.py, etc, then:

python pyinstaller/Makespec.py --onefile myscript.py
python pyinstaller/Build.py myscript.spec 

вот файл спецификации, который он создал:

# -*- mode: python -*-
a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), 'icinga.py'],
             pathex=['/home/user/projects/icinga_python/releases/v2.1'])
pyz = PYZ(a.pure)
exe = EXE( pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name=os.path.join('dist', 'myscript'),
          debug=False,
          strip=False,
          upx=True,
          console=1 )

это встроенный исполняемый файл в

3 ответов


эта ошибка может ocurre, когда у вас есть динамический импорт в коде. В этом случае pyinstaller не включает эти пакеты в exe-файл. В этом случае вы можете:

  1. добавьте неиспользуемый импорт этих пакетов в свой код
  2. скажите pyinstaller включить его

один параметр файла ничего не меняет при запуске кода. Если вы создаете -- onefile exe, все файлы, созданные pyinstaller, упаковываются в exe-файл и распаковываются в локальный темп каждый раз, когда вы запускаете exe.


проблема в том, что pyinstaller не вижу импорт второго уровня. Поэтому, если вы импортируете модуль A, pyinstaller видит этого. Но любой дополнительный модуль, который импортируется в A не будет видно.

нет необходимости что-либо менять в ваших скриптах python. Вы можете напрямую добавить отсутствующий импорт в spec file. Просто добавьте следующее в a = Analysis(...):

hiddenimports=["mysql"],

Это должно быть результат:

a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), 'icinga.py'],
         pathex=['/home/user/projects/icinga_python/releases/v2.1'], hiddenimports=["mysql"],)

после этого запустите pyinstaller с файлом спецификации в качестве аргумента.


просто добавлю свои 2 цента, потому что я столкнулся с той же проблемой сегодня - 6 лет спустя :D

Для Windows:

1) cmd => rightclick => with admin rights
2) Enter in cmd: "pip install pyinstaller"
3) navigate in cmd to the folder of "yourMain.py"
4) Enter in cmd: "pyinstaller --onefile --windowed yourMain.py"

5) If you import other scripts / data in "yourMain.py": 
Manually enter the folder "dist" (gets created - where "yourMain.exe" should be by now), 
and copy your scripts or folder structure there

(e.g. /assets/sounds; /assets/graphics; /scripts; anotherscript.py )

затем я смог запустить exe, дважды щелкнув.

оказалось довольно легко. Что сделало трюк для меня " --onfile "и добавление моих других файлов в папку" dist".

"--windowed " - это просто так, что окно команды python не появится при запуске exe.