Convertissez vos scripts Python en programmes de ligne de commande

王林
Libérer: 2023-04-13 13:46:03
avant
1185 Les gens l'ont consulté

Convertissez vos scripts Python en programmes de ligne de commande

J'ai écrit, utilisé et vu beaucoup de scripts aléatoires au cours de ma carrière. Certaines personnes ont besoin de tâches semi-automatisées, c'est pourquoi elles sont nées. Au bout d'un moment, ils deviennent de plus en plus gros. Ils peuvent changer de mains plusieurs fois au cours de leur vie. Je souhaite souvent que ces scripts offrent une sensation plus proche d'un outil de ligne de commande. Mais est-il difficile de passer de scripts ponctuels aux bons outils pour réellement améliorer le niveau de qualité ? Il s'avère que ce n'est pas si difficile en Python. Créer un script squelette

Dans cet article, je commencerai par un petit morceau de code Python. Je vais l'appliquer à ​​échafaudage​​​ et utilisez ​​click​​ 库扩展它以接受命令行参数。

$ python3 -m pip install scaffold click tox
Copier après la connexion

本文所有没有在这里插入显示的代码示例,你都可以在 ​​https://www.php.cn/link/575afbdca5a101e3088b2b6554398b0c​​ 中找到特定版本的代码。该仓库中的每个提交都描述了本文操作过程中一些有意义的步骤。

这个片段做了几件事:

  • 检查​​INCOMING​​ 指定的路径中是否有文本文件
  • 如果存在,则使用当前时间戳创建一个新文件名,并将其移动到​​ARCHIVE​
  • 删除当前的​​ARCHIVE/latest.txt​​ 链接,并创建一个指向刚刚添加文件的新链接

作为一个示例,它很简单,但它会让你理解这个过程。

使用 Pyscaffold 创建应用程序

首先,你需要安装 ​​scaffold​​​、​​click​​​ 和 ​​tox​​​ ​​Python 库​​。

$ putup rotoscope -p rotoscope 

--force --no-skeleton -n rotoscope 

-d 'Move some files around.' -l GLWT 

-u http://codeberg.org/ofosos/rotoscope 

--save-config --pre-commit --markdown
Copier après la connexion

安装 ​​scaffold​​​ 后,切换到示例的 ​​rotoscope​​ 项目所在的目录,然后执行以下命令:

$ git checkout README.md
Copier après la connexion

Pyscaffold 会重写我的 ​​README.md​

Cet extrait fait plusieurs choses :

  • Check​INCOMING​​ Indique s'il existe un fichier texte dans le chemin spécifié.
  • S'il existe, créez un nouveau nom de fichier avec l'horodatage actuel et déplacez-le vers ​​ARCHIVE​
  • Supprimer le ​​ARCHIVE/latest.txt​​ lien et créez un nouveau lien vers le fichier que vous venez d'ajouter

A titre d'exemple, c'est simple mais cela vous fera comprendre le processus. 🎜🎜Créez une application à l'aide de Pyscaffold🎜🎜Tout d'abord, vous devez installer ​​échafaudage​​​,​​cliquez​​​ et ​​tox​​​ ​​Bibliothèque Python​​. 🎜
$ PRE_COMMIT_ALLOW_NO_CONFIG=1 git commit
Copier après la connexion
Copier après la connexion
🎜Installation ​​échafaudage​​​ Après, passez au ​
console_scripts =

roto = rotoscope.rotoscope:rotoscope
Copier après la connexion
Copier après la connexion
🎜Pyscaffold réécrira mon ​​README.md ​< /code>​, alors restaurez-le depuis Git : 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:python;toolbar:false;">@click.command() @click.argument('incoming', type=click.Path(exists=True)) def rotoscope(incoming): &quot;&quot;&quot; Rotoscope 0.4 - Bleep, blooop. Simple sample that move files. &quot;&quot;&quot;</pre><div class="contentsignin">Copier après la connexion</div></div><div class="contentsignin">Copier après la connexion</div></div>🎜Pyscaffold explique comment configurer un exemple de projet complet dans la documentation, que je ne couvrirai pas ici, vous pourrez l'explorer plus tard. De plus, Pyscaffold peut également vous fournir des modèles d'intégration continue (CI) dans votre projet : 🎜<ul ><li >打包: 你的项目现在启用了 PyPi,所以你可以将其上传到一个仓库并从那里安装它。</li><li >文档: 你的项目现在有了一个完整的文档文件夹层次结构,它基于 Sphinx,包括一个​<a href="https://www.php.cn/link/48b454e539ea33c2028f007fd948336c" target="_blank">​readthedocs.org​</a>​ 构建器。</li><li >测试: 你的项目现在可以与 tox 一起使用,测试文件夹包含运行基于 pytest 的测试所需的所有样板文件。</li><li >依赖管理: 打包和测试基础结构都需要一种管理依赖关系的方法。​<code style="font-family: monospace; font-size: 12px; background-color: rgba(0, 0, 0, 0.06); padding: 0px 2px; border-radius: 6px; line-height: inherit; overflow-wrap: break-word; text-indent: 0px;">​setup.cfg​​ 文件解决了这个问题,它包含所有依赖项。
  • 预提交钩子: 包括 Python 源代码格式工具 black 和 Python 风格检查器 flake8。
  • 查看测试文件夹并在项目目录中运行 ​​tox​​ 命令,它会立即输出一个错误:打包基础设施无法找到相关库。

    现在创建一个 ​​Git​​​ 标记(例如 ​​v0.2​​​),此工具会将其识别为可安装版本。在提交更改之前,浏览一下自动生成的 ​​setup.cfg​​​ 并根据需要编辑它。对于此示例,你可以修改 ​​LICENSE​​ 和项目描述,将这些更改添加到 Git 的暂存区,我必须禁用预提交钩子,然后提交它们。否则,我会遇到错误,因为 Python 风格检查器 flake8 会抱怨糟糕的格式。

    $ PRE_COMMIT_ALLOW_NO_CONFIG=1 git commit
    Copier après la connexion
    Copier après la connexion

    如果这个脚本有一个入口点,用户可以从命令行调用,那就更好了。现在,你只能通过找 ​​.py​​​ 文件并手动执行它来运行。幸运的是,Python 的打包基础设施有一个很好的“罐装”方式,可以轻松地进行配置更改。将以下内容添加到 ​​setup.cfg​​​ 的 ​​options.entry_points​​ 部分:

    console_scripts =
    
    roto = rotoscope.rotoscope:rotoscope
    Copier après la connexion
    Copier après la connexion

    这个更改会创建一个名为 ​​roto​​​ 的 shell 命令,你可以使用它来调用 rotoscope 脚本,使用 ​​pip​​​ 安装 rotoscope 后,可以使用 ​​roto​​ 命令。

    就是这样,你可以从 Pyscaffold 免费获得所有打包、测试和文档设置。你还获得了一个预提交钩子来保证(大部分情况下)你按照设定规则提交。

    CLI 工具化

    现在,一些值会硬编码到脚本中,它们作为命令 ​​参数​​​ 会更方便。例如,将 ​​INCOMING​​ 常量作为命令行参数会更好。

    首先,导入 ​​click​​​ 库,使用 Click 提供的命令装饰器对 ​​rotoscope()​​​ 方法进行装饰,并添加一个 Click 传递给 ​​rotoscope​​ 函数的参数。Click 提供了一组验证器,因此要向参数添加一个路径验证器。Click 还方便地使用函数的内嵌字符串作为命令行文档的一部分。所以你最终会得到以下方法签名:

    @click.command()
    
    @click.argument('incoming', type=click.Path(exists=True))
    
    def rotoscope(incoming):
    
    """
    
    Rotoscope 0.4 - Bleep, blooop.
    
    Simple sample that move files.
    
    """
    Copier après la connexion
    Copier après la connexion

    主函数会调用 ​​rotoscope()​​,它现在是一个 Click 命令,不需要传递任何参数。

    选项也可以使用 ​​环境变量​​​ 自动填充。例如,将 ​​ARCHIVE​​ 常量改为一个选项:

    @click.option('archive', '--archive', default='/Users/mark/archive', envvar='ROTO_ARCHIVE', type=click.Path())
    Copier après la connexion

    使用相同的路径验证器。这一次,让 Click 填充环境变量,如果环境变量没有提供任何内容,则默认为旧常量的值。

    Click 可以做更多的事情,它有彩色的控制台输出、提示和子命令,可以让你构建复杂的 CLI 工具。浏览 Click 文档会发现它的更多功能。

    现在添加一些测试。

    测试

    Click 对使用 CLI 运行器 ​​运行端到端测试​​​ 提供了一些建议。你可以用它来实现一个完整的测试(在 ​​示例项目​​​ 中,测试在 ​​tests​​ 文件夹中。)

    测试位于测试类的一个方法中。大多数约定与我在其他 Python 项目中使用的非常接近,但有一些细节,因为 rotoscope 使用 ​​click​​​。在 ​​test​​​ 方法中,我创建了一个 ​​CliRunner​​​。测试使用它在一个隔离的文件系统中运行此命令。然后测试在隔离的文件系统中创建 ​​incoming​​​ 和 ​​archive​​​ 目录和一个虚拟的 ​​incoming/test.txt​​​ 文件,然后它调用 CliRunner,就像你调用命令行应用程序一样。运行完成后,测试会检查隔离的文件系统,并验证 ​​incoming​​​ 为空,并且 ​​archive​​ 包含两个文件(最新链接和存档文件)。

    from os import listdir, mkdir
    
    from click.testing import CliRunner
    
    from rotoscope.rotoscope import rotoscope
    
    
    class TestRotoscope:
    
    def test_roto_good(self, tmp_path):
    
    runner = CliRunner()
    
    
    with runner.isolated_filesystem(temp_dir=tmp_path) as td:
    
    mkdir("incoming")
    
    mkdir("archive")
    
    with open("incoming/test.txt", "w") as f:
    
    f.write("hello")
    
    
    result = runner.invoke(rotoscope, ["incoming", "--archive", "archive"])
    
    assert result.exit_code == 0
    
    
    print(td)
    
    incoming_f = listdir("incoming")
    
    archive_f = listdir("archive")
    
    assert len(incoming_f) == 0
    
    assert len(archive_f) == 2
    Copier après la connexion

    要在控制台上执行这些测试,在项目的根目录中运行 ​​rotoscope​​ 只是取消了最新文件的链接,无论它是否存在。测试从一个新的文件系统(不是我的主文件夹)开始,很快就失败了。我可以通过在一个很好的隔离和自动化测试环境中运行来防止这种错误。这将避免很多“它在我的机器上正常工作”的问题。

    搭建骨架脚本和模块

    本文到此结束,我们可以使用 ​​scaffold​​​ 和 ​​click​​ 完成一些高级操作。有很多方法可以升级一个普通的 Python 脚本,甚至可以将你的简单实用程序变成成熟的 CLI 工具。

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Étiquettes associées:
    source:51cto.com
    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
    Tutoriels populaires
    Plus>
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal
    À propos de nous Clause de non-responsabilité Sitemap
    Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!