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