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

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