构建 python 项目的非常*简单*的方法是什么?
What is a very *simple* way to structure a python project?
所以我有这个 python 需要处理文件的东西。
首先是:
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
并且如何很好地做到这一点真是该死的不直接。
我想在my_service.py
中做from ..util import string_util
(导入到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
,但这看起来很不自然,并且将它放在 README 中以获得如何 [=74= 的说明真的很糟糕] 这个.
现在我正在用丑陋的 sys.path.append()
hack 解决它。
我还有哪些其他选择?
这是近乎不同的观点,但我会分享我对此的看法。
您应该以不同的方式看待您的项目。选择一个执行点,并从那里引用您的导入,以避免您试图解决的所有奇怪的相对导入。因此,查看您的项目结构:
my_project/
├── script.py
├── util/
│ └── string_util.py
├── services/
│ └── my_service.py
正如您目前所做的那样,从 my_project
中执行您的代码。这样你所有的进口 应该 是关于那一点的。因此,您的导入实际上是这样的:
# my_service.py
from util.string_util import foo
考虑这一点的另一种方法是,如果您要移动项目,或者有一个 CI,您需要确保指定要从中执行的项目根目录。记住这些事情,并指定应该执行项目的单一执行点,将使您在处理构建包和模块并适当引用它们时,让您的生活变得更加轻松,从而允许其他系统正确使用您的项目无需处理奇怪的相对进口。
希望这对您有所帮助。
所以我有这个 python 需要处理文件的东西。
首先是:
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
并且如何很好地做到这一点真是该死的不直接。
我想在my_service.py
中做from ..util import string_util
(导入到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
,但这看起来很不自然,并且将它放在 README 中以获得如何 [=74= 的说明真的很糟糕] 这个.现在我正在用丑陋的
sys.path.append()
hack 解决它。
我还有哪些其他选择?
这是近乎不同的观点,但我会分享我对此的看法。
您应该以不同的方式看待您的项目。选择一个执行点,并从那里引用您的导入,以避免您试图解决的所有奇怪的相对导入。因此,查看您的项目结构:
my_project/
├── script.py
├── util/
│ └── string_util.py
├── services/
│ └── my_service.py
正如您目前所做的那样,从 my_project
中执行您的代码。这样你所有的进口 应该 是关于那一点的。因此,您的导入实际上是这样的:
# my_service.py
from util.string_util import foo
考虑这一点的另一种方法是,如果您要移动项目,或者有一个 CI,您需要确保指定要从中执行的项目根目录。记住这些事情,并指定应该执行项目的单一执行点,将使您在处理构建包和模块并适当引用它们时,让您的生活变得更加轻松,从而允许其他系统正确使用您的项目无需处理奇怪的相对进口。
希望这对您有所帮助。