Python Setuptools:添加脚本的快速方法,无需“main”函数作为“console_scripts”入口点

Pla*_*ong 7 python program-entry-point setuptools entry-point

我的请求看起来很不正统,但我想快速打包一个旧的存储库,主要由 python 可执行脚本组成。

问题在于这些脚本没有被设计为模块,因此其中一些脚本直接在模块顶层执行代码,而另一些脚本则具有该部分if __name__=='__main__'

您将如何使用 setuptools 分发这些脚本而不需要太多重写?

  • 我知道我可以将它们放在scripts的选项下setup(),但不建议这样做,而且它也不允许我重命名它们。
  • 我想跳过main()在所有这些脚本中定义函数,也是因为有些脚本调用奇怪的递归函数,对全局变量有副作用,所以我有点害怕破坏东西。
  • 当我尝试仅提供模块名称作为console_scripts(例如,"myscript=mypkg.myscript"而不是"myscript=mypkg.myscript:main")时,它在安装后逻辑上抱怨模块不可调用。

有没有办法从模块创建脚本?至少当他们有一个if __name__=='__main__'

Jak*_*aas 1

有一些设计注意事项,但我建议为此使用 __main__.py 。

  1. 它允许所有命令行调用共享参数解析逻辑
  2. 你根本不需要接触脚本
  3. 它是显式的(不存在触发导入的无用函数)
  4. 它可以重构任何其他常见的有状态逻辑,因为导入包时永远不会导入 __main__.py
  5. 习俗。人们期望在 __main__.py 中找到命令行调用。

__main__.py

from pathlib import Path
from runpy import run_path

pkg_dir = Path(__file__).resolve().parent

def execute_script():
    script_pth = pkg_dir / "local path to script"
    run_path(str(script_pth), run_name="__main__")

Run Code Online (Sandbox Code Playgroud)

然后,您可以your_package.__main__:execute_script在 setup.py/pyproject.toml 中设置为控制台脚本。显然,您可以通过这种方式拥有任意数量的脚本。