在 Python 中解析本地包导入

Resolving local package imports in Python

提问人:Michael Bonnet 提问时间:11/17/2023 更新时间:11/17/2023 访问量:14

问:

我的 repo 目录结构如下(来自 ):$ tree

.
├── src
│   ├── __init__.py
│   └── stuff.py
├── tests
│   ├── __init__.py
│   ├── test_stuff.py
│   ├── test_utils_constants.py
│   └── test_utils_math.py
└── utils
    ├── __init__.py
    └── math.py

src/__init__.py:

import os
import sys
PROJECT_PATH = os.getcwd()
SOURCE_PATH = os.path.join(
    PROJECT_PATH,"src"
)
sys.path.append(SOURCE_PATH)

tests/__init__.py

import os
import sys
PROJECT_PATH = os.getcwd()
SOURCE_PATH = os.path.join(
    PROJECT_PATH,"tests"
)
sys.path.append(SOURCE_PATH)


utils/__init__.py

import os
import sys
PROJECT_PATH = os.getcwd()
SOURCE_PATH = os.path.join(
    PROJECT_PATH, "utils"
)
sys.path.append(SOURCE_PATH)

由于某种原因,从 in 导入模块并行为不同。tests/src/tests/

在 中,我有以下行:tests/test_utils_math.py

from utils.math import Math

在 中,我有以下行:tests/test_utils_constants.py

from utils.math import Constants

和 都是 中的类。当我在顶级存储库目录中运行时,这些导入似乎运行良好,并且没有遇到任何问题。MathConstantsutils/math.pypython3 -m pytest

在 中,我有以下行:src/stuff.py

from utils.math import Constants,以使用该类。Constants

我收到一个错误:

Traceback (most recent call last):
  File "/home/mbonnet/my_repo/src/stuff.py", line 14, in <module>
    from utils.math import Constants
ModuleNotFoundError: No module named 'utils'

我认为这是由于 pytest 和 Python 以不同的方式理解 repo 的结构。不过,我不知道如何解决/更改此问题。

如何让 Python 发现并使用我在目录中其他位置创建的包?

目录 python-import modulenotfounderror

评论

0赞 Karl Knechtel 11/17/2023
要准确显示正在发生的事情,需要了解您如何使用代码 - 特别是命令行调用,以便我们知道当前工作目录是什么。您可以通过在与问题相关的每个值之前检查 sys.path 的值来正确诊断问题。但正确的方法是在项目中使用相对导入,并作为主源代码的子包,假设它包含程序需要运行的内容。importutils
0赞 Karl Knechtel 11/17/2023
(有些人喜欢将测试分开,而不是分发它们。通常,当一个顶级包被命名时,它将包含一个子文件夹,该子文件夹是“真正的”顶级包,它可能会放在它旁边,但在实际的包中。您现在的设计意味着您打算分发两个完全独立的软件包,分别名为 和。协同工作的代码通常应该位于同一个包中,并使用相对导入,这正是为了避免黑客攻击。srctestsutilssrcutilssys.path
0赞 Karl Knechtel 11/17/2023
但是,作为为什么这种黑客方法不起作用的快速提示:代码尝试将文件夹的路径添加到哪里,什么时候发生?当代码尝试导入包中的模块时,第一步是否已经发生?为什么要有?sys.pathutilssys.pathstuff.pyutils

答: 暂无答案