ImportError: No module named <something>

ImportError: No module named <something>

我知道这个问题已经被问过多次了。我已经通读了所有这些但无法解析我的 issue.The 以下是我的目录结构。

ankur
     --ankur1
             __init__.py
             util.py
     --ankur2
             main.py
     --__init__.py

在 main.py 中,我正在导入以下内容。

import ankur.ankur1.util

当我执行 windows 中的代码时,它工作得很好。但是在 Linux 中,我得到以下错误。

ImportError: No module named ankur.ankur1.util

我还阅读了关于模块和包的官方 python doc

你的包结构没问题。您的导入语句没问题。唯一缺少的是包在 sys.path 中可见,这是一个可以解析导入语句的位置列表。

通常我们通过 pip, which copies your code into site-packages 在本地“安装”软件包来完成此操作。此目录是 sys.path 中的条目之一,因此当您的代码安装在站点包中时,现在可以照常解析导入语句。

但是,要安装代码,您需要为程序包定义安装程序(setup.py 脚本)或构建系统(pyproject.toml 文件)。您的项目似乎没有任何安装程序或构建系统,因此您需要创建一个(有关详细信息,请参阅 Python Packaging User Guide),然后使用 pip 安装程序包。如果您还不想学习 Python 打包,则需要另辟蹊径。

可以直接在 main.py 中修改 sys.path,这随后可以解析语句 import ankur.ankur1.util。这是 hacky,我建议不要这样做。它将添加限制,即执行 main.py 是包其余部分的唯一入口点,因此任何其他想要 import ankur 的代码首先需要知道 main.py 的路径文件系统。这是一种混乱的方法,应该避免。

另一种方法是使用环境 - 有一个环境变量 PYTHONPATH 可用于增加模块文件的默认搜索路径。在你的 shell:

export PYTHONPATH=/path/to/parent  # linux/macOS
SET PYTHONPATH=C:/path/to/parent   # Windows

父级是包含 ankur 子目录的目录。

站点包的确切位置取决于您的 OS/platform,但您可以通过 import sysconfig; sysconfig.get_paths()["purelib"][=49 查看=]