运行 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/script
或 python -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
你刚刚输入 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
.
当您在计算机上安装 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/script
或 python -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
你刚刚输入 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
.