从 pip 安装后没有 python 的 CLI 应用程序

CLI app without python after install from pip

我看过几个 python 包的例子,在从 pypi 之类的东西安装后,有与工具关联的 CLI。

两个示例:rasa(例如rasa init)或streamlit(例如streamlit hello)。

我有兴趣为我自己的包探索这个,我的要求是我不想在我的命令前加上 python。例如,如上所示 rasa init,而不是 python rasa init,但诚然,我不知道这是如何发生的。

这个guide可能会有帮助

这是我的一个简单的 setup.py 来说明我是如何做到的。

scripts= 选项允许您指定脚本的位置。当您安装它时,这些脚本将包含在允许您 运行 它们的路径中。

脚本应该是:

  1. 可执行chmod +x
  2. 有一个 python shebang #!/usr/bin/env python
  3. 最好的做法是让 __name__ == __main__ 部分代码

要测试它,您可以构建它并将其安装在虚拟环境中

python setup.py sdist bdist_wheel  # This will build the tar.gz (identical to what pypi uses)
virtualenv venv  # Create an env so you don't mess your setups
source venv/bin/activate  # Activate environment
pip install -e dist/<package_name>-<version>.tar.gz  # This installs it in the venv

pip list 应该显示已安装

如果安装成功,您的脚本应该可用。在 Mac 上,它是 which script_name。该路径将指向 venv.

entry_points or scripts用于此。

这是 streamlitsetup.py 的相关片段:

setuptools.setup(
    ...
    entry_points={"console_scripts": ["streamlit = streamlit.cli:main"]},
    ...
    # For Windows so that streamlit * commands work ie.
    # - streamlit version
    # - streamlit hello
    scripts=["bin/streamlit.cmd"],
)
  • entry_points 的解释如下:Explain Python entry points?
  • scripts 的解释如下:
  • 这里有一个关于 Pros and cons of 'script' vs. 'entry_point' in Python command line scripts
  • 的问题

有趣的是,一些消息来源似乎声称 entry_points 不适用于 Windows,而其他消息来源声称 scripts 不适用于 Windows ].就我个人而言,我一直在使用 entry_points,它在 Windows 10 和 Linux.

上对我都有效