运行 Python 使 CLI 没有 运行 来自终端的 .py 文件

Run a Python made CLI without running the .py file from terminal

当您在计算机上安装 Git 时,可以从带有“git”的终端运行。类似地,Python 可以是 运行,只需 "python" 或 "py"。

如果我使用 argparse 和 Python 创建一个 CLI,有没有办法让用户只需输入

就可以简单地安装它并在终端中使用它

$ myCLI -option

而不是

$ python path\to\myCLI.py -option

就像我 use/interact 使用的所有 CLI 一样?

粗溶液

您的脚本只需要位于用户 $PATH 中的某个位置(如果您不想让他们键入 myCLI.py,则没有扩展名)。此外,它需要以魔术注释 #!/usr/bin/env python3 开头(如果您是 运行ning Linux)并且可以执行(在分发它之前在 linux chmod +x myCLI 上) .或者,您可以使用所需 OS 的本机 shell 语言创建一个脚本(因此 sh 对应 linux),它调用 python3 /path/to/scriptpython -m module 或之类的

如果你命名你的主脚本时没有使用 .py,它会阻止你从其他任何东西导入它,所以通常的方法是有一个 'entrypoint' 脚本,它包含如下内容:

#!/usr/bin/env python3
from myApp import main
main()

(参见 the PyPa docs 进行讨论)

更好的解决方案

当然,您需要将入口点脚本部署在最终用户 $PATH 的某处。这可能更有趣,但幸运的是,整个事情都由 setuptools 处理,你甚至不需要编写脚本:你只需要一个入口点函数:

Use console_script entry points to register your script interfaces. You can then let the toolchain handle the work of turning these interfaces into actual scripts

official docs

你刚刚输入 setup.py:

setup(
    entry_points = {
        'console_scripts': [
            'PKG_NAME = package.module:func',
        ],
    }
)

并且任何键入 PKG_NAME 的人都将有效地 运行 package.module:func()(因此 func 是您上面的入口点 main() 函数)。

请参阅 this question 讨论这种方法相对于为每个平台编写单独脚本的旧方法的优点。

请注意,如果您没有将应用构建为 python 包,而是使用其他一些打包标准(archlinux PKGBUILD 或 .deb 或其他),您仍然可以采用同样的方法---只需像上面那样编写入口点脚本,然后让包将它放在用户的某个地方 $PATH.