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 нет сообщения "модуль не указан…" для того же модуля, то проблема заключается в скрытом импорте.
Скрытый импорт обрабатывается путем подключения модуля (который выполняет скрытый импорт) во время анализа. Сделайте это следующим образом:
Создайте файл с именем hook-module.py (где module - это полное имя Python, например, hook-xml.dom.py) и поместите его где-нибудь. Запомните это место как ваш личный каталог хуков.
В файле.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.