构建python项目的一个非常简单的方法是什么?

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_utilmy_service.py(这是导入script.pyfrom 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()黑客解决它.

我还有其他选择吗?

idj*_*jaw 2

这与观点接壤,但我会分享我对此的看法。

\n\n

您应该以不同的方式看待您的项目。选择一个执行点,并从那里引用您的导入,以避免您尝试解决的所有奇怪的相对导入。因此,查看您的项目结构:

\n\n
my_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。这样你所有的进口都应该与该点有关。因此,您的导入实际上如下所示:

\n\n
# my_service.py\n\nfrom util.string_util import foo\n
Run Code Online (Sandbox Code Playgroud)\n\n

另一种思考方式是,如果您要移动项目或拥有 CI,则需要确保指定要从中执行的项目根目录。记住这些事情,并指定应该执行项目的单个执行点,将使您在处理构建包和模块并适当引用它们时变得更加轻松,从而允许其他系统正确使用您的项目无需处理奇怪的相对进口。

\n\n

希望这可以帮助。

\n