PyInstaller, spec-файл, ImportError: нет модуля с именем «бла» - PullRequest
14 голосов
/ 15 сентября 2011

Я пытаюсь собрать скрипт на 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 )

Это встроенный исполняемый файл в *Каталог 1009 *.При попытке запустить этот файл я получаю следующее:

Traceback (most recent call last):
  File "<string>", line 12, in <module>
  File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 455, in importHook
    raise ImportError, "No module named %s" % fqname
ImportError: No module named mysql

Если я переместил этот исполняемый файл в каталог фактического кода Python, он дал другие результаты:

Traceback (most recent call last):
  File "<string>", line 12, in <module>
  File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 436, in importHook
    mod = _self_doimport(nm, ctx, fqname)
  File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 521, in doimport
    exec co in mod.__dict__
  File "CLUSTER/mysql/icingasql.py", line 13, in <module>
    import urllib2
  File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 455, in importHook
    raise ImportError, "No module named %s" % fqname
ImportError: No module named urllib2

Inthe ... pyinstaller docs Я вижу, что --onefile - это вариант, который мне нужен / нужен, но по какой-то причине не все компилируется.

Скрипт на самом деле ничего не включаетНеобычные, просто маленькие быстрые модули, которые я написал для SQL-операторов и разбора некоторых веб-сайтов.

Ответы [ 3 ]

5 голосов
/ 27 августа 2014

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

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

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

2 голосов
/ 16 ноября 2017

просто добавлю свои 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.

2 голосов
/ 26 января 2017

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

Нет необходимости что-либо менять в ваших скриптах на python. Вы можете напрямую добавить отсутствующий импорт в файл спецификации . Просто добавьте в 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 с файлом спецификации в качестве аргумента.

...