所以我有这个需要处理文件的python。
首先是:
Chrome_WidgetWin_1
我只想用my_project/
├── script.py
运行它。
然后它变得成长:
python script.py file.csv
(每个目录中都有一个空my_project/
├── script.py
├── util/
│ └── string_util.py
├── services/
│ └── my_service.py
)
但是现在 __init__.py
想要使用 my_service.py
,这真是太棒了,不能直截了当怎么做很好。
我想在 string_util.py
(使用from ..util import string_util
导入 my_service.py
)中script.py
进行操作,但这不适用于from services import my_service
,因为 python script.py
的my_service
只有__name__
(我得到 {{ 1}} )
我可以services.my_service
和Attempted relative import beyond toplevel package
,但这看起来很不自然,如果将它放在自述文件中以获取如何运行它的话会非常糟糕。
现在我正在用丑陋的cd ..
黑客解决它。
我还有其他选择吗?
答案 0 :(得分:2)
这接近于意见,但我会分享我对此的看法。
您应该以不同的方式看待您的项目。选择一个执行点,并从那里引用您的导入,以避免您尝试解决的所有奇怪的相对导入。所以,看看你的项目结构:
my_project/
├── script.py
├── util/
│ └── string_util.py
├── services/
│ └── my_service.py
正如您目前所做的那样,请在my_project
内执行您的代码。这样,你的所有导入应该就这一点而言。因此,您的导入实际上如下所示:
# my_service.py
from util.string_util import foo
另一种思考方式是,如果要移动项目或拥有CI,则需要确保指定要执行的项目根目录。牢记这些事情,并指定项目应该执行的单一执行点,在处理结构化包和模块并适当引用它们时,将使您的生活更轻松,允许其他系统正确使用您的项目无需处理奇数相对进口。
希望这会有所帮助。