如何在 Python 中创建可以与 PIP 一起安装的 CLI?

Par*_*ram 6 python pip command-line-interface

正如标题所暗示的那样,我正在尝试从命令行访问 python 脚本。我发现像clickargv这样的库可以很容易地访问从命令行传递的参数,但用户仍然必须通过 Python 运行脚本。

代替

python /location/to/myscript.py
Run Code Online (Sandbox Code Playgroud)

我希望能够做到

myscript
Run Code Online (Sandbox Code Playgroud)

从任何目录

据我所知,我可以通过编辑我的 PATH 变量在我的计算机上实现这一点。但是,我希望能够简单地做到:

pip install myscript
Run Code Online (Sandbox Code Playgroud)

然后通过myscript从任何地方键入来访问脚本。是否有一些特殊的代码我会放在setup.py

Tom*_*art 25

用于console_scripts挂钩特定的 Python 方法(不是整个可执行文件),setup.py文件:

\n
from setuptools import setup\nsetup(\n    ...\n    entry_points = {\n        \'console_scripts\': [\'mybinary=mymodule.command_line:cli\'],\n    },\n    name=\'mymodule\',\n    ...\n)\n
Run Code Online (Sandbox Code Playgroud)\n

脚本command_line.py将是:

\n
import mymodule\n\ndef cli():\n    print("Hello world!")\n
Run Code Online (Sandbox Code Playgroud)\n

项目目录如下所示:

\n
myproject/\n    mymodule/\n        __init__.py\n        command_line.py\n        ...\n    setup.py\n
Run Code Online (Sandbox Code Playgroud)\n
\n

setuptools 将生成一个独立的脚本 \xe2\x80\x98shim\xe2\x80\x99 ,该脚本导入您的模块并调用注册的函数。

\n
\n

该垫片允许您直接调用mybinary并确保它被 python 正确调用。它提供特定于平台的垫片(即,在 Windows 上它生成一个 .exe)。

\n

有关详细信息,请参阅包装文档

\n


d_k*_*etz 9

你可以这样做 setuptools

一个很好的例子setup.py(比如你的包需要熊猫和 numpy):

import setuptools
setuptools.setup(
    name='myscript',
    version='1.0',
    scripts=['./scripts/myscript'],
    author='Me',
    description='This runs my script which is great.',
    packages=['lib.myscript']
    install_requires=[
        'setuptools',
        'pandas >= 0.22.0',
        'numpy >= 1.16.0'
    ],
    python_requires='>=3.5'
)
Run Code Online (Sandbox Code Playgroud)

您的目录应设置如下:

[dkennetz package]$ ls
lib scripts setup.py
Run Code Online (Sandbox Code Playgroud)

里面的 lib 将是:

[dkennetz package]$ ls lib
myscript
Run Code Online (Sandbox Code Playgroud)

里面myscript将是:

[dkennetz package]$ ls lib/myscript
__main__.py
__init__.py
helper_module1.py
helper_module2.py
Run Code Online (Sandbox Code Playgroud)

main 将用于调用您的函数并执行您想做的任何操作。

内部脚本将是:

[dkennetz package]$ ls scripts
myscript
Run Code Online (Sandbox Code Playgroud)

和内容myscript将是:

#!/usr/bin/env bash

if [[ ! $@ ]]; then
    python3 -m myscript -h
else
    python3 -m myscript $@
fi
Run Code Online (Sandbox Code Playgroud)

然后运行你做: python setup.py install

这将安装您的程序以及您包含在install_requires=[]setup.py 中的所有依赖项,并myscript作为命令行模块安装:

[dkennetz ~]$ myscript
Run Code Online (Sandbox Code Playgroud)

  • 是的,一切正常。就我而言,问题是我的文件夹名为“MyScript”,但“setup.py”中的包名称是“myscript”。谢谢@d_kennetz (2认同)

Jab*_*Jab 5

setuptools我知道这个问题比较旧,对于使用肯定使用Tombart 的答案的项目

也就是说,我一直在使用诗歌并且使用一个.toml文件,如果这就是你所使用的,因为这可能是其他人会搜索的内容,这里是你如何使用 toml 文件打包脚本(至少使用诗歌

[tool.poetry.scripts]
myscript = "mybinary=mymodule.command_line:cli"
Run Code Online (Sandbox Code Playgroud)

不确定这是否适用于 flit 或任何其他包管理器,但它适用于诗歌