从相关目录导入用户创建的 Python 模块和数据文件

Importing user-created Python modules and data files from relative directories

我正在构建一组相互依赖的 Python 模块。

我的文件目录目前看起来像:

.
├── utilities
│   ├── __init__.py
│   ├── utility.py
│   ├── data.csv
├── src
│   ├── __init__.py
│   |── functions
│       ├── __init__.py
│       └── function.py
└── __init__.py

此外,function.pyutilities/data.csv 导入数据。

从顶级目录(.),我运行 python3 src/functions/function.py

我收到以下导入错误:

Traceback (most recent call last):
  File "src/functions/function.py", line 1, in <module>
    from utilities.utility import UtilityFunctionA
ImportError: No module named 'utilities'

如何从 function.py 文件正确导入 utilities?或者我不应该首先 运行ning 嵌套文件,而是 运行ning 目录顶层的文件?

从 PyCharm.

中 运行ning 这段代码时导入成功

愚蠢的问题,但尽管阅读了大量文档(和谷歌搜索)我还是无法弄清楚。


更新:

使用 python3 -m src.functions.function 从命令行 运行 通过正确导入并成功加载 csv 的模块。

然而,当我 运行 来自 PyCharm 的模块时,例如使用

现在我收到 OSError: File b'utilities/data.csv' does not exist

的错误

有什么方法可以在 PyCharm 和命令行中将我的模块设置为 运行 吗?

正确导入:

python3 -m src.functions.function

基于How to do relative imports in Python?

如果您希望能够 - from utilities.utility import UtilityFunctionA - 从 function.py 内,当 运行ning 从顶级目录 - . 时。您需要 运行 python 文件作为一个模块,使用 -m 选项。示例 -

python3 -m src.functions.function

但是只有当您始终从 . 目录(顶级目录)中 运行 时,上述方法才有效。我总是要么手动将顶级目录添加到 PYTHONPATH 环境变量中。

或使用 os.path 和相对路径以编程方式使用 __file__ 将其添加到 sys.path。示例 -

import sys
import os.path
path_to_top = os.path.abspath(os.path.join(os.path.dirname(__file__),'..','..'))
sys.path.append(path_to_top)

在此之后进行导入。如果目录结构始终保持不变,即使在其他系统中也可以使用,而无需设置任何环境变量。


根据更新后的要求 -

Now I receive the error that OSError: File b'utilities/data.csv' does not exist

Is there any way to setup my module to run both from within PyCharm and also from the command line?

读取文件,Python以当前工作目录为起点,所有相对路径都是相对于当前工作目录解析的。依赖当前工作目录作为特定目录绝不是一个好主意,因为我们可以使用脚本的绝对路径从任何地方 运行 python 脚本。同样对于加载文件,我们可以使用 os.path 和相对路径来创建文件的绝对路径。示例 -

import os.path
path_to_datacsv = os.path.abspath(os.path.join(os.path.dirname(__file__),'..','..','utilities,'data.csv'))