我们最近在一个项目中添加了pycrypto,现在我无法在使用pyinstaller构建软件后运行该软件。
我在pyinstaller中遇到了新软件包的问题,但我无法特别修复这个问题。
我在尝试运行构建的软件时遇到的错误如下(很抱歉转述,构建需要很长时间)
一开始是这样的:
No package Crypto.Cipher
因此,我在.spec文件中将'Crypto'
添加到了hiddenimports
中。然后我得到了
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上玩得很好的技巧吗?
根据pyinstaller手册:
您可以通过使用Python的verbose imports标志来验证隐藏导入是否是问题所在。如果导入消息显示"找不到模块",但warnproject.txt文件中没有针对同一模块的"no module named…"消息,则问题是隐藏的导入。
隐藏导入是通过在分析时挂接模块(执行隐藏导入的模块)来处理的。按以下步骤操作:
创建一个名为hook-module.py的文件(其中module是完全限定的Python名称,例如hook-xml.dom.py),并将其放置在某个位置。记住这个地方作为你的私有挂钩目录。
在.spec文件中,将您的私有hooks目录作为hookspath参数传递给Analysis,以便进行搜索。示例:
a=分析(['myscript.py'],hookspath='/my/priv/hook')在大多数情况下,挂钩模块只有一行:
hiddenimports=[模块1',模块2']当Analysis找到该文件时,它将完全按照模块显式导入模块1和模块2的方式进行。
这个问题似乎是相关的,答案可能对你也有用。
最后,这份报告似乎也包含类似的问题。用户似乎可以通过更新到pyinstaller 2.1来修复它,所以如果你还没有,你可能想尝试一下。
此答案:
发件人https://stackoverflow.com/a/48408950/4355695:请使用pycryptodomex而不是pycrypto dome。@galgalesh在OP问题下方的评论给出了为什么不应该再使用pycrypto。
pip卸载-y-pycryptopip卸载-y-pycryptodomepip安装pycryptodomex
pycryptodomex给出了一个明显不明确的Cryptodome模块来代替Crypto。因此,在你的.py程序中,用Cryptodome:取代Crypto
从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',
来源https://stackoverflow.com/a/48408950/4355695:使用pycryptodomex
而不是pycryptodome
。@galgalesh在OP问题下方的评论给出了为什么不应该再使用pycrypto。
pip uninstall -y pycrypto
pip uninstall -y pycryptodome
pip install pycryptodomex
pycryptodomex
给出了一个明显不明确的Cryptodome模块来代替Crypto。因此,在你的.py程序中,用Cryptodome:取代Crypto
from Cryptodome.PublicKey import RSA
我现在重新运行了pyinstaller,它运行正常。无需进行任何特殊的隐藏导入等。在dist文件夹中,现在有一个清晰的Crpytodome
文件夹,其中包含所有.pyd。