Setuptools 集成 — 单击文档

来自菜鸟教程
Click/docs/8.0.x/setuptools
跳转至:导航、​搜索

设置工具集成

在编写命令行实用程序时,建议将它们编写为随 setuptools 分发的模块,而不是使用 Unix shebangs。

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

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

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

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

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

  3. 主要技巧仅在脚本是 Python 模块时才有效。 如果您的应用程序变得太大并且您想开始使用一个包,您将遇到问题。

介绍

要将脚本与 setuptools 捆绑在一起,您只需要 Python 包中的脚本和 setup.py 文件。

想象一下这个目录结构:

yourscript.py
setup.py

yourscript.py的内容:

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 .

之后,您的命令应该可用:


包中的脚本

如果您的脚本不断增长,并且您想切换到包含在 Python 包中的脚本,则所需的更改很少。 假设您的目录结构更改为:

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

在这种情况下,您可以使用 packages 和 setuptools 的自动包查找支持,而不是在 setup.py 文件中使用 py_modules。 除此之外,还建议包含其他包数据。

这些将是 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',
        ],
    },
)