返回介绍

设置工具集成

发布于 2025-05-06 21:24:11 字数 2477 浏览 0 评论 0 收藏

在编写命令行实用程序时,建议将它们作为使用安装工具分发的模块来编写,而不是使用 unix shebangs。

你为什么要这么做?原因有很多:

  1. 传统方法的一个问题是,Python 解释器加载的第一个模块的名称不正确。这听起来可能是个小问题,但它具有相当重要的含义。

    第一个模块不是按其实际名称调用的,而是由解释器将其重命名为 __main__ . 虽然这是一个完全有效的名称,但这意味着如果另一段代码想要从该模块导入,它将以其真实名称再次触发导入,并且您的代码突然被导入两次。

  2. 并非所有平台上的操作都容易执行。在 Linux 和 OS X 上,可以在文件开头添加注释。 ( #!/usr/bin/env python )您的脚本工作起来就像一个可执行文件(假设它设置了可执行位)。但这在 Windows 上不起作用。在 Windows 上,您可以将解释器与文件扩展名相关联(例如,所有内容都以 .py 通过 python 解释器执行)然后,如果您想在 virtualenv 中使用脚本,就会遇到问题。

    实际上,在 virtualenv 中运行脚本也是 OS X 和 Linux 的一个问题。对于传统方法,您需要激活整个 virtualenv,以便使用正确的 python 解释器。用户不太友好。

  3. 只有当脚本是一个 python 模块时,主技巧才起作用。如果您的应用程序太大,并且您希望开始使用一个包,那么您将遇到问题。

介绍

要将脚本与安装工具捆绑在一起,您所需要的只是 python 包中的脚本和 setup.py 文件。

想象一下这个目录结构:

yourscript.py
setup.py

内容 yourscript.py

import click

@click.command()
def cli():
    """Example script."""
    click.echo('Hello World!')

内容 setup.py

from setuptools import setup

setup(
    name='yourscript',
    version='0.1.0',
    py_modules=['yourscript'],
    install_requires=[
        'Click',
    ],
    entry_points={
        'console_scripts': [
            'yourscript = yourscript:cli',
        ],
    },
)

魔法就在 entry_points 参数。下面 console_scripts ,每行标识一个控制台脚本。等号前的第一部分 ( = )是应该生成的脚本的名称,第二部分是导入路径,后跟冒号 ( : )使用 click 命令。

就是这样。

测试脚本

要测试脚本,可以创建新的 virtualenv,然后安装包:

$ virtualenv venv
$ . venv/bin/activate
$ pip install --editable .

之后,您的命令应可用:

$ yourscript
Hello World!

包中的脚本

如果您的脚本正在增长,并且您希望切换到包含在 Python 包中的脚本,那么所需的更改是最小的。假设您的目录结构更改为:

project/
    yourpackage/
        __init__.py
        main.py
        utils.py
        scripts/
            __init__.py
            yourscript.py
    setup.py

在这种情况下,不要使用 py_modules 在你 setup.py 您可以使用的文件 packages 以及自动寻找安装工具支持的软件包。除此之外,还建议包括其他包数据。

这些将是 setup.py

from setuptools import setup, find_packages

setup(
    name='yourpackage',
    version='0.1.0',
    packages=find_packages(),
    include_package_data=True,
    install_requires=[
        'Click',
    ],
    entry_points={
        'console_scripts': [
            'yourscript = yourpackage.scripts.yourscript:cli',
        ],
    },
)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。