如何在Python中创建一个可以通过PIP安装的CLI?

问题描述 投票:0回答:5

正如标题所示,我正在尝试制作一个可从命令行访问的 python 脚本。我发现像 clickargv 这样的库可以轻松访问从命令行传递的参数,但用户仍然必须通过 Python 运行脚本。

而不是

python /location/to/myscript.py

我希望能够做到

myscript

从任何目录

据我了解,我可以通过编辑 PATH 变量在我的计算机上实现此目的。但是,我希望能够简单地做到:

pip install myscript

然后从任何地方输入

myscript
来访问脚本。我是否需要在
setup.py
中放入一些特殊代码?

python pip command-line-interface
5个回答
27
投票

使用

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

from setuptools import setup
setup(
    ...
    entry_points = {
        'console_scripts': ['mybinary=mymodule.command_line:cli'],
    },
    name='mymodule',
    ...
)

command_line.py
脚本将是:

import mymodule

def cli():
    print("Hello world!")

项目目录如下所示:

myproject/
    mymodule/
        __init__.py
        command_line.py
        ...
    setup.py

Setuptools 将生成一个独立的脚本“shim”,它导入您的模块并调用注册的函数。

该垫片允许您直接调用

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

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


16
投票

您可以使用

setuptools

来做到这一点

一个很好的例子

setup.py
(假设你的包需要 pandas 和 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'
)

您的目录应设置如下:

[dkennetz package]$ ls
lib scripts setup.py

lib 内部将是:

[dkennetz package]$ ls lib
myscript

myscript
里面是:

[dkennetz package]$ ls lib/myscript
__main__.py
__init__.py
helper_module1.py
helper_module2.py

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

内部脚本将是:

[dkennetz package]$ ls scripts
myscript

myscript
的内容将是:

#!/usr/bin/env bash

if [[ ! $@ ]]; then
    python3 -m myscript -h
else
    python3 -m myscript $@
fi

然后运行你:

python setup.py install

这将安装您的程序以及 setup.py 中

install_requires=[]
中包含的所有依赖项,并将
myscript
安装为命令行模块:

[dkennetz ~]$ myscript

6
投票

我知道这个问题比较旧,对于使用

setuptools
的项目,肯定使用 Tombart 的答案

也就是说,我一直在使用诗歌并且使用

.toml
文件,如果这就是你使用的,因为这可能是其他人会搜索的内容,这里是你如何使用 toml 文件打包脚本(至少使用诗歌)

[tool.poetry.scripts]
myscript = "mybinary=mymodule.command_line:cli"

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


0
投票

假设您在 bash shell 中并且安装了 python 3 并且您希望能够执行您所请求的操作,则需要将脚本文件的路径附加到您家中的

.bash_profile
文件中的 PATH 变量目录。 另外,在您的 python 脚本文件中,您需要有类似于以下内容的内容作为脚本的第一行:

#!/usr/bin/env python3

此外,您可以从脚本文件中删除扩展名 (.py),这样,如上面的示例所示,文件名是一个脚本,与 script.py 不同。

您还需要将文件名的权限设置为

chmod 755 文件名

如果您希望该脚本可在系统范围内访问,则需要修改 /etc/profile 并将其添加到文件底部:

export PATH=$PATH:/path/to/script

或者,如果将 python 脚本文件移至

/usr/local/bin
,则可能无需进行任何配置文件更改,因为此目录通常已在 PATH 中。

要查看 PATH 的值,请在 shell 中发出以下命令

echo $PATH

0
投票

在现代项目中,您将根据

PEP621
使用 pyproject.toml,并且您的构建系统会选择它,而不是使用
setup.cfg
setup.py
。您仍然可以使用
setuptools
,但它也会理解
pyproject.toml
文件的内容。

使用

pyproject.toml
时,您可以将入口点指定为:

[project.scripts]
my-script = "mylib.mymodule:entry_function"

该函数应该可导入为:

from mylib.mymodule import entry_function

安装软件包后,您就可以访问

my-script
可执行文件。

有关入口点的更多信息:https://setuptools.pypa.io/en/latest/userguide/entry_point.html

© www.soinside.com 2019 - 2024. All rights reserved.