gpt4 book ai didi

python - 如何以正确的方式为独立的 python 应用程序制作 setup.py?

转载 作者:行者123 更新时间:2023-12-03 09:32:20 25 4
gpt4 key购买 nike

我已经阅读了几个类似的主题,但还没有成功。我觉得我错过或误解了一些基本的东西,这就是我失败的原因。
我有一个用 python 编写的“应用程序”,我想在标准 setup.py 的帮助下部署它。由于功能复杂,它由不同的 python 模块组成。但是这个模块的单独发布是没有意义的,因为它们太具体了。
预期结果是在 pip install 的帮助下将软件包安装在系统中并且可以通过简单的 app 从 OS 命令行获得命令。
将长篇故事简化为可重现的示例 - 我有以下目录结构:

<root>
├─ app
| ├─ aaa
| | └── module_a.py
| ├─ bbb
| | └── module_b.py
| └── app.py
├─ docs
| └── .....
├─ tests
| └── .....
└─ setup.py
以下是模块代码:
应用程序.py
#!/usr/bin/python
from aaa.module_a import method1
from bbb.module_b import method2

def main():
print("APP main executed")
method1()
method2()

if __name__ == '__main__':
main()
模块_a.py
def method1():
print("A1 executed")
模块_b.py
def method2():
print("B2 executed")
当我从控制台运行 app.py 时,它可以正常工作并给出预期的输出:
APP main executed
A1 executed
B2 executed
所以,这个简单的“应用程序”工作正常,我想在以下帮助下分发它
setup.py
from setuptools import setup

setup(
name="app",
version="1.0",
packages=['app', 'app.aaa', 'app.bbb'],
package_dir={'app': 'app'},
entry_points={
'console_scripts': ['app=app.app:main', ]
}
)
同样,一切看起来都很好,测试安装看起来也不错:
(venv) [user@test]$ pip install <root>
Processing /home/user/<root>
Using legacy 'setup.py install' for app, since package 'wheel' is not installed.
Installing collected packages: app
Running setup.py install for app ... done
Successfully installed app-1.0
(venv) [user@test]$
现在问题来了。使用 setup.py 中的上述 entry_points,我希望能够使用 ./app 命令执行我的应用程序。确实有效。但应用程序本身失败并显示错误消息:
File "/test/venv/lib/python3.9/site-packages/app/app.py", line 3, in <module>
from aaa.module_a import method1
ModuleNotFoundError: No module named 'aaa'
我了解错误的原因 - 这是因为 pip install放置目录 aaabbb连同 app.py在一个目录中 app . IE。从这个角度来看 app.py应该使用 import app.aaa而不是 import aaa .但是如果我这样做了,那么我的应用程序在开发过程中会出现错误:
ModuleNotFoundError: No module named 'app.aaa'; 'app' is not a package
这也是合乎逻辑的,因为没有 app当时可用的软件包...(它正在开发中,尚未安装在系统中...)
最后。问题是 - 为包含几个自己的模块的独立 python 应用程序创建目录结构和 setup.py 的正确方法是什么?
更新
最有希望的结果(但在评论中讨论后证明是错误的)是我在进行了以下更改后得出的:
  • 将 app.py 从 <root>/app 移出进入 <root>本身
  • 我在 setup.py 中引用了它通过 py_modules=['app']
  • 我从 import aaa.method1 更改了导入至import app.aaa.method1

  • 这种方式包在我的开发环境和安装后都可以工作。
    但我遇到了 entry_points 的问题- 我看不到如何配置入口点以使用 main()来自 app.py这不是 app 的一部分包但是一个单独的模块....
    IE。新结构是
    <root>
    ├─ app
    | ├─ aaa
    | | └── module_a.py
    | ├─ bbb
    | | └── module_b.py
    | └──__init__.py
    ├─ docs
    | └── .....
    ├─ tests
    | └── .....
    ├─ app.py
    └─ setup.py
    IE。这里的逻辑 - 有 2 个独立的实体:
  • 一个空包app (仅由 初始化 .py 组成)和子包 aaa , bbb
  • 一个脚本app.py使用子包中的函数 app.aaa , app.bbb

  • 但正如我所写 - 我看不出如何为 app.py 定义入口点。允许它直接从操作系统命令行运行。

    最佳答案

    使用该目录(包)结构,在您的 app.py您应该导入为以下之一:

    from app.aaa.module_a import method1
    from .aaa.module_a import method1
    然后确保调用您的应用程序,如下所示:
    app
    (这应该归功于控制台入口点)
    python -m app.app
    (即使没有控制台入口点也应该可以工作)

    我尝试在这里重新创建完整的项目
    目录结构:
    .
    ├── app
    │   ├── aaa
    │   │   └── module_a.py
    │   ├── app.py
    │   └── bbb
    │   └── module_b.py
    └── setup.py
    setup.py
    import setuptools

    setuptools.setup(
    name="app",
    version="1.0",
    packages=['app', 'app.aaa', 'app.bbb'],
    entry_points={
    'console_scripts': ['app=app.app:main', ]
    },
    )
    app/app.py
    #!/usr/bin/python

    from .aaa.module_a import method1
    from .bbb.module_b import method2

    def main():
    print("APP main executed")
    method1()
    method2()

    if __name__ == '__main__':
    main()
    app/aaa/module_a.py
    def method1():
    print("A1 executed")
    app/bbb/module_b.py
    def method2():
    print("B2 executed")
    然后我运行以下命令:
    $ python3 -V
    Python 3.6.9
    $ python3 -m venv .venv
    $ .venv/bin/python -m pip install -U pip setuptools wheel
    # [...]
    $ .venv/bin/python -m pip list
    Package Version
    ------------- -------------------
    pip 20.3.3
    pkg-resources 0.0.0
    setuptools 51.1.0.post20201221
    wheel 0.36.2
    $ .venv/bin/python -m pip install .
    # [...]
    $ .venv/bin/python -m app.app
    APP main executed
    A1 executed
    B2 executed
    $ .venv/bin/app
    APP main executed
    A1 executed
    B2 executed
    $ .venv/bin/python -m pip uninstall app
    # [...]
    $ .venv/bin/python -m pip install --editable .
    # [...]
    $ .venv/bin/python -m app.app
    APP main executed
    A1 executed
    B2 executed
    $ .venv/bin/app
    APP main executed
    A1 executed
    B2 executed

    关于python - 如何以正确的方式为独立的 python 应用程序制作 setup.py?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65407999/

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