我读过很多关于导入包和模块的文章,使用绝对和相对语法,但我无法让它导入我需要的函数(我不是Python专家)。我使用 VSCode(在 Ubuntu 中),并拥有一个存储库结构,其中一个文件夹中包含 Jupyter 笔记本,另一个文件夹中包含脚本,如下所示:
data/
model_notebooks/
└── model_nb.ipynb
src/
└── myutils.py
我可以通过更改笔记本开头的当前工作目录,然后导入我需要的函数,将
myutils.py
中的函数导入到笔记本中:
import os
os.chdir('../src/')
from myutils import data_load
这也适用于导入整个
.py
库,而不仅仅是一个函数。
我现在正在尝试将这些笔记本导出到脚本中,但在导入函数时遇到问题。存储库结构发生了一些变化:
data/
src/
└── myutils.py
└── model_scripts/
└── model.py
只有将
model.py
和 myutils.py
放在同一文件夹(同一级别)中,例如在 src/
中(不更改脚本中的 cwd),我才能使其工作。
据我所知,当从控制台执行脚本时,当前工作存储库不依赖于文件路径,而是依赖于我运行脚本的控制台路径,因此在执行时它不起作用
repo_root$ python src/model_scripts/model.py
与脚本中的 os.chdir('../src/')
。
但是如果我在
src/
内用执行它
repo_root/src$ python model_scripts/model.py
我明白了ModuleNotFoundError: No module named 'myutils'
。
我也尝试过相对导入,但没有成功。它必须在不同的系统上运行,并且应该独立于控制台中的当前路径工作。任何帮助将不胜感激。
__init__.py
导入系统
导入操作系统
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(file), '..')))
从 myutils 导入 data_load
python src/model_scripts/model.py