【问题标题】:ModuleNotFoundError but the module name exists in one of the directories in sys.pathModuleNotFoundError 但模块名称存在于 sys.path 的目录之一中
【发布时间】: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

问题

  1. 这是无法导入的原因吗?如果不是,原因是什么?

  2. 如果是这样,为什么会发生这种情况?

【问题讨论】:

  • 是的。默认情况下pip 将安装到site-packages。 Python 本身并不关心dist-infos,只需要实际的包。您需要将其复制到那里,或者将您的 sys.path 更改回默认值。您可能通过安装 conda 来做到这一点,然后更改了您的 python 配置。如果您想暂时禁用它,请查看您的 .bashrc 并注释掉这些行。
  • @EricJin 1.如果我必须将其复制到那里,其他人在安装此库时会遇到同样的问题,还是与我的计算机配置方式有关? 2. 将我的sys.path 改回默认值是什么意思?
  • 第一个问题的原因是因为我构建了库,所以如果我的构建过程执行不正确,我想解决这个问题。
  • 我在安装 conda 时遇到了同样的问题。您的包管理器并没有真正损坏,您只是将包位置设置到其他地方。要将 sys.path 更改回默认值,您可能需要查看您的 .bashrc 以删除带有 conda 初始化内容的末尾附近的行。
  • @EricJin 会试一试。一旦我删除了这些行,我是否需要运行任何东西才能将sys.path 恢复为默认值?

标签: python path package sys


【解决方案1】:

我在这里有同样的问题。下面的这个解决方案对我有用。

首先,检查您拥有的python版本(必须在python3.8和3.10(包括)之间。据我了解,没有python3.7和python3.11。

要检查它,请在您的笔记本/python 中执行此操作:

import sys
print(sys.version)

如果它与 3.8-3.10 范围匹配,那么您可以跳过此步骤,否则您可能需要执行以下操作(在终端中):

virtualenv venv --python=python3.8
source venv/bin/activate

现在让我们从源代码安装这个库,以便我们拥有所需的源文件。在终端中运行它:

git clone https://github.com/o-P-o/disagree.git
cd disagree
# requirements fixed
pip install numpy pandas mathx scipy tqdm
# install this
pip install .

现在您应该可以导入不同意,但有一点不同:

from disagree import disagree
# or for example
from disagree.disagree.agreements import BiDisagreements

请让我知道这是否适合您。 我将做一个拉取请求来修复这个库。

马蒂诺

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2021-08-28
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多