Pyinstaller & Pycrypto


Мы недавно добавили pycrypto в проект, над которым мы работали, и теперь я не могу запустить программное обеспечение после его сборки с помощью pyinstaller.

У меня были проблемы с новыми пакетами в pyinstaller, но я не могу исправить этот в частности.

Ошибки, которые я получил при попытке запустить встроенное программное обеспечение, следующие (извините за перефразирование, это занимает довольно много времени для сборки)

Сначала это было что-то вроде:

No package Crypto.Cipher

Поэтому я добавил 'Crypto' к the hiddenimports in my .Spec-файл. Тогда я получил,

No module named Cipher

Поэтому я изменил 'Crypto' на 'Crypto.Cipher' , а затем получил

Crypto.Cipher has no attribute AES

Поэтому я изменил 'Crypto.Cipher' на 'Crypto.Cipher.AES', а затем получил

File "C:FoldermadebypyinstallerCrypto.Cipher.AES", line 49 in <module>
ImportError: cannot import name blockalgo

Поэтому я изменил 'Crypto.Cipher.AES' на 'Crypto.Cipher.AES.blockalgo', и ошибка не изменилась.

Я пробовал несколько различных конфигураций, но вывод скрипта сборки всегда говорит что-то вроде

ERROR: Hidden import 'blockalgo' not found.

Кто-нибудь знает, как заставить это правильно импортировать, или знает трюк, чтобы заставить pycrypto играть хорошо с pyinstaller?

3 5

3 ответа:

Согласно руководству pyinstaller:

Вы можете проверить, что проблема заключается в скрытом импорте, используя флаг подробного импорта Python. Если импорт сообщения говорят "модуль не найден", но warnproject.txt-файл не имеет имени модуля " no..."сообщение для того же модуля, то проблема заключается в скрытом импорте.

Скрытый импорт обрабатывается путем подключения модуля (который выполняет скрытый импорт) во время анализа. Сделайте это следующим образом:

  1. Создайте файл с именем hook-module.py (где модуль-это полное имя Python, например, hook-xml.dom.py) и поместите его где-нибудь. Запомните это место как свой личный каталог крючков.

  2. В .spec file, передайте свой частный каталог hooks в качестве аргумента hookspath для анализа, поэтому будет произведен поиск. Пример:

    A = анализ(['myscript.py'], hookspath= '/ my / priv / hooks') В большинстве случаев модуль крюка будет иметь только одну строку:

    Hiddenimports = ['module1', 'module2'] Когда анализ найдет этот файл, он будет работать точно так же, как если бы модуль явно импортировал module1 и module2.

Этот вопрос кажется связанным, ответы также могут быть полезны для вас.

Наконец, этот отчет , по-видимому, содержит аналогичную проблему. Пользователь, по-видимому, смог исправить это, обновившись до pyinstaller 2.1, поэтому вы можете попробовать, если еще не сделали этого.

Перемены? Почему бы не добавить? Добавление их в hiddenimport решило эту проблему: 'Crypto', 'Crypto.Cipher', 'Crypto.Cipher.AES', 'Crypto.Random',

Из https://stackoverflow.com/a/48408950/4355695 : используйте pycryptodomex вместо pycryptodome. И комментарий @galgalesh под вопросом OP дал, почему pycrypto больше не должен использоваться.

pip uninstall -y pycrypto
pip uninstall -y pycryptodome
pip install pycryptodomex

pycryptodomex дает четко связную модуль Криптокупола на замену крипто. Итак, в вашем .программы пы, замену Крипто с Криптокупола:

from Cryptodome.PublicKey import RSA

Теперь я снова запустил pyinstaller, и это сработало правильно. Не нужно делать никаких специальных hiddenimports и т. д. В папке dist, теперь есть ясная папка Crpytodome, содержащая все .pyd'S.