Pyinstaller & Pycrypto

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

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

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

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

No package Crypto.Cipher

Итак, я добавил 'Crypto' к hiddenimports в моем.spec файле. Тогда я получил,

No module named Cipher

Итак, я изменился 'Crypto' в 'Crypto.Cipher' а потом я получил,

Crypto.Cipher has no attribute AES

Итак, я изменился 'Crypto.Cipher' в 'Crypto.Cipher.AES' тогда я получил

File "C:\Folder\made\by\pyinstaller\Crypto.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 ответа

Решение

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

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

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

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

  2. В файле.spec передайте свой личный каталог ловушек в качестве аргумента hookspath в Analysis, чтобы выполнить поиск. Пример:

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

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

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

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

Этот ответ:

С /questions/2853746/kak-postroit-ispolnyaemyij-fajl-s-pyinstaller-kotoryij-ispolzuet-pycryptodome/2853764#2853764: используйте pycryptodomex вместо pycryptodome. И комментарий @galgalesh под вопросом OP объясняет, почему Pycrypto больше не должен использоваться.

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

Pycryptodomex дает явно недвусмысленный модуль Cryptodome, чтобы заменить Crypto. Итак, в ваших программах.py замените Crypto на Cryptodome:

из Cryptodome. PublicKey импорт RSA

Теперь я запустил pyinstaller заново, и он сработал правильно. Нет необходимости выполнять какие-либо специальные скрытые операции импорта и т. Д. В папке dist теперь есть чистая папка Crpytodome, в которой хранятся все файлы.pyd.

У меня отлично работает!

Используйте Pycryptodomex вместо Pycrypto, и это будет работать!

Я думаю, что это связано с Python 3.6 и основными изменениями Pycrypto для работы! Тогда он перестанет работать с 2.7.16!

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

С /questions/2853746/kak-postroit-ispolnyaemyij-fajl-s-pyinstaller-kotoryij-ispolzuet-pycryptodome/2853764#2853764: используйте pycryptodomex вместо pycryptodome, И комментарий @galgalesh под вопросом OP объясняет, почему Pycrypto больше не должен использоваться.

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

pycryptodomex дает явно недвусмысленный модуль Cryptodome вместо Crypto. Итак, в ваших программах.py замените Crypto на Cryptodome:

from Cryptodome.PublicKey import RSA

Теперь я запустил pyinstaller заново, и это сработало правильно. Нет необходимости выполнять какие-либо специальные скрытые операции импорта и т. Д. В папке dist теперь есть Crpytodome папка, в которой хранятся все файлы.pyd.

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