Blo*_*oke 7 python module project-structure package python-import
所以我有这个需要处理文件的python.
首先它是:
my_project/
??? script.py
Run Code Online (Sandbox Code Playgroud)
而我只是简单地运行它python script.py file.csv
.
然后它成长并成为:
my_project/
??? script.py
??? util/
? ??? string_util.py
??? services/
? ??? my_service.py
Run Code Online (Sandbox Code Playgroud)
(__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__
只是再services.my_service
(和我得到的Attempted relative import beyond toplevel package
)
我可以做cd ..
和python -m my_project.script
,但似乎如此不自然的,将是非常糟糕的把它的自述文件如何运行这个指令.
现在我用丑陋的sys.path.append()
黑客解决它.
我还有其他选择吗?
这与观点接壤,但我会分享我对此的看法。
\n\n您应该以不同的方式看待您的项目。选择一个执行点,并从那里引用您的导入,以避免您尝试解决的所有奇怪的相对导入。因此,查看您的项目结构:
\n\nmy_project/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 script.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 util/\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 string_util.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 services/\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_service.py\n
Run Code Online (Sandbox Code Playgroud)\n\n正如您当前所做的那样,从 中执行您的代码my_project
。这样你所有的进口都应该与该点有关。因此,您的导入实际上如下所示:
# my_service.py\n\nfrom util.string_util import foo\n
Run Code Online (Sandbox Code Playgroud)\n\n另一种思考方式是,如果您要移动项目或拥有 CI,则需要确保指定要从中执行的项目根目录。记住这些事情,并指定应该执行项目的单个执行点,将使您在处理构建包和模块并适当引用它们时变得更加轻松,从而允许其他系统正确使用您的项目无需处理奇怪的相对进口。
\n\n希望这可以帮助。
\n