Pyinstaller & Pycrypto



我们最近在一个项目中添加了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…"消息,则问题是隐藏的导入。

隐藏导入是通过在分析时挂接模块(执行隐藏导入的模块)来处理的。按以下步骤操作:

  1. 创建一个名为hook-module.py的文件(其中module是完全限定的Python名称,例如hook-xml.dom.py),并将其放置在某个位置。记住这个地方作为你的私有挂钩目录。

  2. 在.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。

相关内容

  • 没有找到相关文章

最新更新