PyInstaller не правильно импортирует pycrypto... иногда
Я упаковываю проект с помощью PyInstaller на разных компьютерах с Ubuntu. На некоторых из них при выполнении сгенерированного проекта выдается эта ошибка:
Файл "~/PyInstaller-2.1/proj/build/proj/out00-PYZ.pyz/Crypto.Random", строка 28, в ImportError: невозможно импортировать имя OSRNG
Однако импорт отлично работает в консоли Python, и я могу выполнить проект без упаковки.
Я попытался удалить и переустановить Pycrypto без успеха, я также попытался добавить конкретный
от Crypto. Случайный импорт OSRNG
к основному файлу, чтобы PyInstaller поднял его.
3 ответа
Я решил это, добавив дерево каталогов Crypto в spec-файл
Я получаю путь с помощью этой функции:
def get_crypto_path():
'''Auto import sometimes fails on linux'''
import Crypto
crypto_path = Crypto.__path__[0]
return crypto_path
А затем подставьте в spec-файл:
dict_tree = Tree('CRYPTO_PATH', prefix='Crypto', excludes=["*.pyc"])
a.datas += dict_tree
Я смог решить проблему с рецептом Хитвена, но с немного другим .spec
файл. Я оставлю это здесь для справки для всех.
# -*- mode: python -*-
#Tweaks to properly import pyCrypto
#Get the path
def get_crypto_path():
'''Auto import sometimes fails on linux'''
import Crypto
crypto_path = Crypto.__path__[0]
return crypto_path
#Analysis remains untouched
a = Analysis(['myapp.py'],
pathex=[],
hiddenimports=[],
hookspath=None,
runtime_hooks=None)
#Add to the tree the pyCrypto folder
dict_tree = Tree(get_crypto_path(), prefix='Crypto', excludes=["*.pyc"])
a.datas += dict_tree
#As we have the so/pyd in the pyCrypto folder, we don't need them anymore, so we take them out from the executable path
a.binaries = filter(lambda x: 'Crypto' not in x[0], a.binaries)
#PYZ remains untouched
pyz = PYZ(a.pure)
#EXE remains untouched
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='myapp',
debug=False,
strip=None,
upx=True,
console=True )
#COLLECT remains untouched
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=None,
upx=True,
name='myapp')
Я получил его, заменив pycrypto / pycryptodome на pycryptodomex
, Поделиться ссылкой на уже опубликованный ответ: /questions/2563567/pyinstaller-and-pycrypto/2563577#2563577