问题描述
我正在按以下方式构建一个项目:
repo-name/
.venv
src/
__init__.py
module1.py
module2.py
scratches/
script1.py
poetry.lock
pyproject.toml
在script1.py中,我想使用module1.py和module2.py中定义的类,因此文件看起来像:
#repo-name/scratches/script1.py
import src.module1 as m1
我使用 Pycharm 作为 IDE,并且我已将 src 标记为源目录。如果我在 Pycharm 中运行 script1.py,则不会出现任何错误。但是,如果我导航到 repo-name/scratches/ 并运行 poetry shell
然后运行 python script1.py
,我会收到以下错误:
ModuleNotFoundError: No module named 'src'
绝对导入不能从 repo-name 开始,因为仓库名称中有“-”。
有没有什么解决方案可以在不改变存储库结构的情况下运行脚本?
解决方法
解决方案
你可以这样做:
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__),'..'))
sys.path.append(os.path.dirname(__file__))
将此代码放在脚本的顶部,在其他导入之前。
说明
使用 sys.path.append()
,您可以将任何文件夹/目录添加到 sys.path
列表中。当您导入内容时,解释器会在此列表中查找模块和包。因此,您可以向其中添加自己的 src 路径并使导入工作。
此外,我使用了一些 os
工具,例如 os.path.dirname
或 os.path.join
结合 __file__
变量来自动添加 ./../
目录(其中 {{1 }} 是)和 src
目录(脚本所在的位置)。