我在 Ubuntu 19.10 上运行。我已经安装了 Pythonpbkdf2和
pip3 install pbkdf2
使用pip3 show
参数我可以看到它已安装。
$pip3 show pbkdf2
Name: pbkdf2
Version: 1.3
Summary: PKCS#5 v2.0 PBKDF2 Module
Home-page: http://www.dlitz.net/software/python-pbkdf2/
Author: Dwayne C. Litzenberger
Author-email: [email protected]
License: UNKNOWN
Location: /home/xyz/.local/lib/python3.7/site-packages
Requires:
Required-by:
尝试运行这个简单的代码;
import base64
from Crypto.Cipher import AES
from pbkdf2 import PBKDF2
salt = 16 * b'\0'
key = PBKDF2(Config.SECRET, salt).read(32)
iv = PBKDF2(Config.SECRET, salt).read(16)
出现此错误
$python3.7 pbkdf2.py
Traceback (most recent call last):
File "pbkdf2.py", line 3, in <module>
import PBKDF2
ModuleNotFoundError: No module named 'PBKDF2'
我该如何解决这个问题?
注1:我也尝试过pbkdf2
使用 Ubuntu 包管理器进行安装,但是并没有解决这个问题。
笔记2:使用python3.7 -m pip install pbkdf2
我有这个
defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: pbkdf2 in /home/xyx/.local/lib/python3.7/site-packages (1.3)
如果首先删除,pip3 uninstall pbkdf2
那么我只会收到第一个警告。
答案1
这里的核心问题通过聊天室针对此问题进行讨论和进一步故障排除后发现,您尝试运行的文件与您尝试导入的库具有完全相同的名称。
Python 在检查库时非常挑剔。一般来说,import
当直接从 Ubuntu 系统目录中调用 Python 命令时,它会检查环境中的以下 3 个位置。它还会按以下顺序排列这些位置:
- 您当前的工作目录,或者正在执行的目录。(在这种情况下
/home/xyz/Projects/Python/
,它包含pbkdf2.py
您尝试执行的相同文件,但也带有与您尝试执行的内容完全相同的名称import
!) - 用户的本地 Python 3 包存储。这是从 PyPI
pip3
安装的pbkdf2
。 - 系统的包库(应该只包含 Python 标准库和您使用 安装的内容
sudo pip3
)。
由于您的文件已命名pbkdf2.py
,并且与我们在用户的本地软件包存储中为 Python 3 安装的库的名称完全相同,因此它尝试从自身导入,但由于显而易见的原因,导入失败。将您的文件重命名pbkdf2.py
为pbkdf2_.py
或类似名称(只要名称不是pbkdf2.py
),然后它应该“正常工作”。
(它之所以“正常工作”是因为第一种情况(将 Projects 目录检查为项目的“源根”)不再存在 - 没有pbkdf2.py
文件,因此无法从中导入。然后它回到第二种情况,即您的用户包存储实际/home/xyz/.local/lib/python3.7/site-packages
所在的位置pbkdf2
,因此import
命令成功。)