【发布时间】:2020-01-04 18:06:24
【问题描述】:
考虑以下 Python 项目框架:
proj/
├── foo
│ └── __init__.py
├── README.md
└── scripts
└── run.py
在这种情况下foo 保存主要项目文件,例如
# foo/__init__.py
class Foo():
def run(self):
print('Running...')
而scripts 包含需要从foo 导入文件的辅助脚本,然后通过以下方式调用:
[~/proj]$ python scripts/run.py
有两种导入Foo 的方法都失败了:
- 如果尝试相对导入
from ..foo import Foo,则错误为ValueError: attempted relative import beyond top-level package - 如果尝试 absolute 导入
from foo import Foo,则错误为ModuleNotFoundError: No module named 'foo'
我目前的解决方法是将运行路径附加到sys.path:
import sys
sys.path.append('.')
from foo import Foo
Foo().run()
但这感觉像是一种 hack,必须添加到 scripts/ 中的每个新脚本中。
有没有更好的方法来构建此类项目中的脚本?
【问题讨论】:
-
你有什么理由不把
__init__.py放到proj或者scripts直接放到foo因为它们都是辅助功能?
标签: python python-3.x pythonpath