ModuleNotFoundError: 'Crypto' — pycryptodome 与 pycryptodomex 的坑

代码里:

from Crypto.Cipher import AES

一跑就崩:

ModuleNotFoundError: No module named 'Crypto'

网上一查装个 pycrypto——别装,那个包 2013 年就停维护了,还有已知漏洞。

两个包,两个命名空间

现在的正主是这两个,装错任何一个都不通用:

包名导入命名空间
pycryptodomefrom Crypto...
pycryptodomexfrom Cryptodome...
  • pycryptodome:兼容老代码,占用 Crypto 顶层名字
  • pycryptodomex:改名版本,把命名空间挪到 Cryptodome,避免和老 pycrypto 冲突

同一个环境里最多装一个。要是老代码用 from Crypto...,就装 pycryptodome

装到虚拟环境里,别装到系统 Python

PyCharm / VSCode 打开项目通常自动激活了虚拟环境(比如 .venv),但你在别的终端 pip install 时可能装到系统 Python 去了:

pip install pycryptodome         # 装哪儿了?看运气

最稳的写法是显式用当前项目的 Python:

D:\Projects\myapp\.venv\Scripts\python.exe -m pip install pycryptodome

或者:

py -m pip install pycryptodome         # Windows py launcher
python -m pip install pycryptodome     # 当前激活的解释器

检查装到哪里了

where python
python -c "import sys; print(sys.executable)"
python -m pip show pycryptodome

Location 字段就是包所在目录,肉眼比对一下是不是当前项目的 site-packages。

老代码遇到 pycryptodomex

某些镜像里预装的是 pycryptodomex。老代码不想改的话,兼容层写一下:

try:
    from Crypto.Cipher import AES
except ImportError:
    from Cryptodome.Cipher import AES

一句话总结

Crypto = pycryptodome,Cryptodome = pycryptodomex,二选一装到当前项目 Python 里。用 python -m pip install 比裸 pip install 稳。