从相关目录导入用户创建的 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.py
从 utilities/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'))
我正在构建一组相互依赖的 Python 模块。
我的文件目录目前看起来像:
.
├── utilities
│ ├── __init__.py
│ ├── utility.py
│ ├── data.csv
├── src
│ ├── __init__.py
│ |── functions
│ ├── __init__.py
│ └── function.py
└── __init__.py
此外,function.py
从 utilities/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'))