从Crypto导入Random -> ImportError: 无法导入名称Random

14 投票
7 回答
51971 浏览
提问于 2025-04-17 00:25

我已经把pycrypto(版本2.3)安装到了/usr/local/lib/python2.6/dist-packages/Crypto/这个地方,并且我能在那儿看到Random这个包。

但是当我尝试导入Crypto.Random的时候,它给我提示了一个错误:

from Crypto.Random import *
ImportError: No module named Random

有没有人知道为什么会出现这个问题呢?谢谢。

import Crypto
import os
print(Crypto.__file__);
print (dir(Crypto));
print(os.listdir(os.path.dirname(Crypto.__file__)))

结果:

/usr/lib/python2.6/dist-packages/Crypto/__init__.pyc
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__revision__', '__version__']
['Hash', 'Protocol', 'PublicKey', 'test.py', 'Util', 'test.pyc', '__init__.pyc', '__init__.py', 'Cipher']

7 个回答

2

看起来在Windows上安装的那个包叫做crpyto,而不是Crypto。在经过了太多的排查后,我把包文件夹的名字大小写改了一下(在\Python[版本]\Lib\site-packages里),结果就好了。

3

你提到你把Crypto安装在了
/usr/local/lib/python2.6/dist-packages/Crypto/这个地方。

但是,从你的评论来看,似乎你还在
/usr/lib/python2.6/dist-packages/Crypto/这个地方也安装了Crypto。

所以你现在有两个安装版本,而后面的那个会优先使用,因为/usr/lib/python2.6/dist-packages/在系统路径中排在前面。

我之前也遇到过同样的问题,最后通过把/usr/lib/python2.6/dist-packages/Crypto改个名字,比如改成Crypto_bak来解决,这样如果有什么问题还可以恢复。

15

你可能在你的Python包里有另一个叫做Crypto的模块。你可以用下面的代码来检查一下:

import Crypto
print(Crypto.__file__)
# should print /usr/lib/python2.6/dist-packages/Crypto/__init__.pyc

如果你发现有另一个Crypto模块,要么把它重命名,要么删除它,或者调整一下sys.path

另外,你的pycrypto版本可能过时了。可以检查一下Crypto.__version__ - Crypto.Random这个功能是从2.1.0alpha1版本开始有的。

撰写回答