我如何使用 setuptools 或 distutils 分发脚本而不是 Python 包?

How do I use setuptools or distutils to distribute a script as opposed to a Python package?

过去,我看到的大多数 distutilssetuptools 的教程似乎都是为了分发所谓的 "Python packages";即,密切相关的 Python 模块的集合,最终旨在作为一个单元一起导入到其他东西中。

我有一些稍微不同的东西:一个大的命令行脚本。该脚本当前位于 Python 项目中,其结构类似于:

git_repo/
    .gitignore
    README.rst
    src/
        myscript.py
        sub_module1.py
        sub_module2.py
        sub_module3.py
    test/
        test_sub_module1.py
        test_sub_module2.py
        test_sub_module3.py

myscript.py 文件中,前几行如下所示:

#!/usr/bin/env python

import sub_module1
import sub_module2
import sub_module3

# Go do a bunch of stuff...
# etc...

包含在各种子模块中的代码大部分是我无法想象的在另一个项目中重复使用的东西;这些部分都非常特定于主应用程序,myscript.py。此外,每个 submodule.py 文件中的 material 在一个子模块和另一个子模块之间也不是那么紧密相关。总的来说,我不认为将它们组合成一个具有自己的 __init__.py 文件的子包是特别自然或合乎逻辑的。事实上,我一开始拥有这些子模块文件的唯一原因只是为了帮助更清晰地组织主脚本;这样做会导致顶级 myscript.py 文件出现,比如说,100 行,而不是全部堆积成一个巨大的 1000 行滚动。

在我的 git_repo/src 目录中,我可以通过在命令行键入它来执行此脚本,例如:

./myscript.py --opt1 <value_1> --opt2 <value_2> --opt3 <value_3> ...

我的问题:由于这个项目是一个命令行脚本而不是一个可导入的包,在那种情况下我应该如何调用setuptools setup() 函数?我如何 select setup() 的输入参数,以便让它知道它应该将 myscript.py 视为可执行脚本(例如,意味着它知道做 chmod 755 myscript.py 在安装过程中),同时还明确附带的 submodule.py 文件虽然不是脚本本身,但仍然是必需的依赖项,应该安装在同一目录中与 myscript.py 相邻的位置?在这种情况下,setup 函数的正确形式是什么?

您应该使用 setuptools 入口点,pip install pkg 将为您创建一个 bin/ 脚本。当您进行系统范围的软件包安装时,脚本将转到 /usr/bin/usr/local/bin.

About entry points