pyInstaller: ошибка импорта

Я в Windows, использую pyInstaller для упаковки файла Python. Но произошла ошибка:

Traceback (most recent call last):
  File "<string>", line 2, in <module>
  File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 386, in i
mportHook
    mod = _self_doimport(nm, ctx, fqname)
  File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 480, in d
oimport
    exec co in mod.__dict__
  File "D:\Useful Apps\pyinstaller-2.0\server\build\pyi.win32\server\out00-PYZ.p
yz\SocketServer", line 132, in <module>
  File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 386, in i
mportHook
    mod = _self_doimport(nm, ctx, fqname)
  File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 480, in d
oimport
    exec co in mod.__dict__
  File "D:\Useful Apps\pyinstaller-2.0\server\build\pyi.win32\server\out00-PYZ.p
yz\socket", line 47, in <module>
  File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 409, in i
mportHook
    raise ImportError("No module named %s" % fqname)
ImportError: No module named _socket

я знаю это _socket в пути C:\Python27\libs\_socket.lib, но как можно позволить EXE найти этот файл?

13 ответов

Если вы используете virtualenv, вы должны использовать опцию "-p" или "--path='D:...'". Как это:

pyinstaller.exe --onefile --paths=D:\env\Lib\site-packages  .\foo.py

Это генерирует файл foo.spec с этим путем pathex

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

В моем случае мне пришлось удалить все папки и файлы, связанные с pyinstaller в моем каталоге, т.е. __pycache__, build, dist, а также *.spec. Я повторно запустил сборку, и exe заработал.

Это похоже на работу для скрытого импорта (доступно только в последних сборках).

Из документов

a = Analysis(['myscript.py'], 
             hiddenimports = ['_socket'], 
             <and everything else>)

Вы можете добавить путь к файлу спецификации вашего приложения.

В объекте анализа вы можете указать pathex=['C:\Python27\libs\', 'C:\Python27\Lib\site-packages']и любой другой путь...

Обратите внимание, что если путь не найден, проблем нет... У меня также есть пути из linux.

просто удалите '__pycache__'каталог, затем снова запустите ваш exe-файл. У меня получилось

Очередной пост "В моем случае".

pypdfium2(импорт в моем файле, который я хочу преобразовать в .exe) имеет .dll, который он вызывает, называетсяpdfium.pyinstallerне импортирует эту .dll при сборке .exe по умолчанию.

Исправить:

думаю можно сделать вариант--collect-all pypdfium2, но по крайней мере для меня--add-data "C:\Program Files\Python39\Lib\site-packages\pypdfium2\pdfium.dll";.(«.» в конце преднамеренно и необходимо!) Сделал свою работу.

Если вы используете виртуальную среду, проблема связана с окружающей средой.

РЕШЕНИЕ Просто активируйте среду и запустите команду pyinstaller. Например, если вы используете среду pipenv, выполните команды в следующем порядке.

      pipenv shell # To activate environment

pyintaller --onefile youscript.py # Command to generate executable  

Были похожие проблемы. Вот мое исправление для PyQt5, cffi, python 3.4.3:

Это исправляет ошибку 'sip' not found и '_cffi_backend', если она появляется:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['LightShowApp.py'],
             pathex=['c:\\MyProjects\\light-show-editor-36',
             'c:\\Python34\\libs\\', 'c:\\Python34\\Lib\\site-packages'],
             binaries=None,
             datas=None,
             hiddenimports=['sip', 'cffi'],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='LightShowApp',
          debug=False,
          strip=False,
          upx=True,
          console=True )

Посмотрите на "pathex" и "hiddenimports" выше. Это единственные изменения по умолчанию. Сборка exe с помощью:

pyinstaller LightShowApp.spec -F

Я запускал это вне venv или pip-win - для чего это дерьмо!

Исполнитель не знает расположение библиотеки, "C:\Python27\Lib\site-packages" и т. Д. Таким образом, pyinstaller связывает расположение модулей при создании исполняемого файла. Следовательно, вам необходимо импортировать все модули, которые вы использовали в своей программе.

Импортируйте модуль "_socket" в свой основной файл и перекомпилируйте его с помощью pyinstaller.

Я бы, наверное, поработал.

Примечание. Но версии модулей, установленных в вашей системе и используемых в программе, должны быть совместимы.

Я узнал, что если вы сделаете setup.py для своего кода и запуститеpython setup.py installа потомpython setup.py buildpyinstaller сможет найти ваши пакеты. вы можете использовать функцию find_packages из setuptools в вашем файле setup.py, чтобы она автоматически включала все.

Ни один из вышеперечисленных ответов не помог мне, но я заставил его работать. Я использовал openpyxl, и он требует jdcal в модуле datetime.py. Ни один из скрытых импортов или любой из этих методов не помог, при запуске exe все равно было бы сказано, что jdcal not found. Обходной путь, который я использовал, - просто скопировать несколько функций из jdcal непосредственно в datetime.py в коде openpyxl. Потом побежал pyinstaller -F program.py

и это сработало!

Я использовал среду conda, и в моем случае модульscipy.ioне удалось найти при запуске моегоpyinstallerисполняемый файл. В моем коде у меня былоimport scipy. Изменение этого наfrom scipy import ioисправил проблему.

Другие вопросы по тегам