gpt4 book ai didi

python - 包的正确 Python 项目结构

转载 作者:行者123 更新时间:2023-12-01 07:11:15 26 4
gpt4 key购买 nike

我正在创建一个 Python 实用程序,需要通过 pip 包在内部共享,并将作为库和命令行工具使用。

我在正确使用命名空间以及在何处/何时/是否放置 __init__.py 文件以获得一致的代码库方面遇到困难。

  • 我可以让“库”使用正常工作,因此我可以 from example_service.example import Example
  • 我可以使用 CLI,因此可以执行 python example_service/example_cli.py
  • 我可以让 pytest 工作。
  • 我无法同时让这三个功能同时工作。

所以

  • 我的包应该使用 from filename import Class 还是 from .filenamefrom example_service.filename
  • 我是否应该将 __init__.py 放入我的包目录中?看来 Python3 不需要它,但我得到的结果好坏参半。
<小时/>
  • 如果
    • example.py 使用 from componenta import ComponentA
    • example_cli.py 使用 from example import Example
    • 然后 CLI 调用起作用
    • 库导入失败没有名为“componenta”的组件
  • 如果
    • example.py 使用 from example_service.componenta import ComponentA
    • example_cli.py 使用 from example import Example
    • 然后 CLI 调用失败没有名为“example_service”的组件
    • 库导入有效
<小时/>

我目前有一个看起来像这样的项目目录:

project_root/
example_service/
example.py
example_cli.py
componenta.py
componentb.py
tests/
__init__.py
test_example.py
setup.py
requirements.txt

在我的主库代码 example.py 中,我有:

from componenta import ComponentA

class Example(object):
def foo(self):
a = ComponentA()
print("Example.foo()")

我的 CLI 包装器将处理参数和其他东西,但现在只是:

#!/usr/bin/env python
from example import Example

class ExampleCli(object):
def __init__(self):
print("ExampleCli.init()")
e = Example()
e.foo()

if __name__ == '__main__':
ExampleCli()

componenta.py是:

class ComponentA(object):
def bar(self):
print("ComponentA.bar()")

(完整代码已发布至 GitHub )

最佳答案

几 pip :

  • 确实,没有 __init__.py 的包应该可以工作(我认为从 Python 3.3 开始)。如果您不需要它(即:您没有什么可写的),则可以将其省略。

  • 我永远不会直接调用 python example_service/example_cli.py。您有用于此目的的setuptools入口 pip ,因此在您的情况下直接调用example。 (您可以从 example_service/example_cli.py 中删除 shebang 和可执行位。)

  • 在包 example_service 中,您可以使用 from example_service.componenta import ComponentAfrom .componenta import ComponentA。在这两种情况下,这应该是相同的。

关于python - 包的正确 Python 项目结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58210276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com