【发布时间】:2022-11-08 20:33:59
【问题描述】:
问题
我已经 pip 安装了一个名为 disagree 的库,它安装和升级没有任何问题,确认已成功安装最新版本。
运行 import disagree 时出现错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'disagree'
确定导致问题的原因
https://docs.python.org/3/tutorial/modules.html#packages 中的第 6.1.2 节说,当一个模块被导入时,如果它不在 sys.builtin_module_names 中,那么它将继续在 sys.path 中指定的文件路径中搜索它。
当我运行sys.path 时,我得到:
['', '/Users/oliverprice/miniconda3/lib/python38.zip',
'/Users/oliverprice/miniconda3/lib/python3.8',
'/Users/oliverprice/miniconda3/lib/python3.8/lib-dynload',
'/Users/oliverprice/.local/lib/python3.8/site-packages',
'/Users/oliverprice/miniconda3/lib/python3.8/site-packages']
事实上,查看'/Users/oliverprice/miniconda3/lib/python3.8/site-packages' 我可以看到我安装的模块。但是,它只有包的.dist-info 文件,而不是实际的包文件夹。 IE。而不是
name
name-version.dist-info
唯一存在的是:
disagree-1.2.6.dist-info
所以看起来那里没有实际的包,只有.dist-info。具体来说,这是其中内容的快照:
defusedxml
defusedxml-0.6.0.dist-info
dill
dill-0.3.4.dist-info
disagree-1.2.6.dist-info
distutils-precedence.pth
docutils
docutils-0.16.dist-info
easy_install.py
entrypoints-0.3.dist-info
问题
-
这是无法导入的原因吗?如果不是,原因是什么?
-
如果是这样,为什么会发生这种情况?
【问题讨论】:
-
是的。默认情况下
pip将安装到site-packages。 Python 本身并不关心dist-infos,只需要实际的包。您需要将其复制到那里,或者将您的sys.path更改回默认值。您可能通过安装 conda 来做到这一点,然后更改了您的 python 配置。如果您想暂时禁用它,请查看您的.bashrc并注释掉这些行。 -
@EricJin 1.如果我必须将其复制到那里,其他人在安装此库时会遇到同样的问题,还是与我的计算机配置方式有关? 2. 将我的
sys.path改回默认值是什么意思? -
第一个问题的原因是因为我构建了库,所以如果我的构建过程执行不正确,我想解决这个问题。
-
我在安装 conda 时遇到了同样的问题。您的包管理器并没有真正损坏,您只是将包位置设置到其他地方。要将
sys.path更改回默认值,您可能需要查看您的.bashrc以删除带有 conda 初始化内容的末尾附近的行。 -
@EricJin 会试一试。一旦我删除了这些行,我是否需要运行任何东西才能将
sys.path恢复为默认值?