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 build
pyinstaller сможет найти ваши пакеты. вы можете использовать функцию 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
исправил проблему.