返回顶部
首页 > 资讯 > 后端开发 > Python >Python实现脚本转换为命令行程序
  • 136
分享到

Python实现脚本转换为命令行程序

2024-04-02 19:04:59 136人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录搭建骨架脚本使用 Pyscaffold 创建应用程序CLI 工具化测试搭建骨架脚本和模块在我的职业生涯中,我写过、用过和看到过很多随意的脚本。一些人需要半自动化完成任务,于是它们

在我的职业生涯中,我写过、用过和看到过很多随意的脚本。一些人需要半自动化完成任务,于是它们诞生了。一段时间后,它们变得越来越大。它们在一生中可能转手很多次。我常常希望这些脚本提供更多的 命令行工具式 的感觉。但是,从一次性脚本到合适的工具,真正提高质量水平有多难呢?事实证明这在 python 中并不难。

搭建骨架脚本

在本文中,我将从一小段 Python 代码开始。我将把它应用到 ​ ​scaffold​ ​​ 模块中,并使用 ​ ​click​ ​ 库扩展它以接受命令行参数。

#!/usr/bin/python

from glob import glob
from os.path import join, basename
from shutil import move
from datetime import datetime
from os import link, unlink


LATEST = 'latest.txt'
ARCHive = '/Users/mark/archive'
INCOMING = '/Users/mark/incoming'
TPATTERN = '%Y-%m-%d'


def transmogrify_filename(fname):
    bname = basename(fname)
    ts = datetime.now().strftime(TPATTERN)
    return '-'.join([ts, bname])

def set_current_latest(file):
    latest = join(ARCHIVE, LATEST)

    try:
        unlink(latest)
    except:
        pass
    link(file, latest)


def rotate_file(source):

    target = join(ARCHIVE, transmogrify_filename(source))
    move(source, target)
    set_current_latest(target)


def rotoscope():
    file_no = 0
    folder = join(INCOMING, '*.txt')
    print(f'Looking in {INCOMING}')

    for file in glob(folder):
        rotate_file(file)
        print(f'Rotated: {file}')
        file_no = file_no + 1
    print(f'Total files rotated: {file_no}')

if __name__ == '__main__':

    print('This is rotoscope 0.4.1. Bleep, bloop.')
    rotoscope()

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

这个片段做了几件事:

​INCOMING​
​ARCHIVE​
​ARCHIVE/latest.txt​

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

使用 Pyscaffold 创建应用程序

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

$ python3 -m pip install scaffold click tox

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

$ 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

Pyscaffold 会重写我的 ​ ​README.md​ ​,所以从 git 恢复它:

$ git checkout README.md

Pyscaffold 在文档中说明了如何设置一个完整的示例项目,我不会在这里介绍,你之后可以探索。除此之外,Pyscaffold 还可以在项目中为你提供持续集成(CI)模板:

  • 打包: 你的项目现在启用了 PyPi,所以你可以将其上传到一个仓库并从那里安装它。
  • 文档: 你的项目现在有了一个完整的文档文件夹层次结构,它基于 Sphinx,包括一个​ ​readthedocs.org​ ​ 构建器。
  • 测试: 你的项目现在可以与 tox 一起使用,测试文件夹包含运行基于 pytest 的测试所需的所有样板文件。
  • 依赖管理: 打包和测试基础结构都需要一种管理依赖关系的方法。​ ​setup.cfg​ ​ 文件解决了这个问题,它包含所有依赖项。
  • 预提交钩子: 包括 Python 源代码格式工具 black 和 Python 风格检查器 flake8。

查看测试文件夹并在项目目录中运行 ​ ​tox​ ​ 命令,它会立即输出一个错误:打包基础设施无法找到相关库。

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

$ PRE_COMMIT_ALLOW_NO_CONFIG=1 git commit

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

console_scripts =
    roto = rotoscope.rotoscope:rotoscope

这个更改会创建一个名为 ​ ​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.

    """

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

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

@click.option('archive', '--archive', default='/Users/mark/archive', envvar='ROTO_ARCHIVE', type=click.Path())

使用相同的路径验证器。这一次,让 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

要在控制台上执行这些测试,在项目的根目录中运行 ​ ​tox​ ​。

在执行测试期间,我在代码中发现了一个错误。当我进行 Click 转换时,​ ​rotoscope​ ​ 只是取消了最新文件的链接,无论它是否存在。测试从一个新的文件系统(不是我的主文件夹)开始,很快就失败了。我可以通过在一个很好的隔离和自动化测试环境中运行来防止这种错误。这将避免很多“它在我的机器上正常工作”的问题。

搭建骨架脚本和模块

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

以上就是Python实现脚本转换为命令行程序的详细内容,更多关于Python脚本转命令行的资料请关注编程网其它相关文章!

--结束END--

本文标题: Python实现脚本转换为命令行程序

本文链接: https://lsjlt.com/news/120540.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python实现脚本转换为命令行程序
    目录搭建骨架脚本使用 Pyscaffold 创建应用程序CLI 工具化测试搭建骨架脚本和模块在我的职业生涯中,我写过、用过和看到过很多随意的脚本。一些人需要半自动化完成任务,于是它们...
    99+
    2024-04-02
  • 将你的 Python 脚本转换为命令行程序
    在我的职业生涯中,我写过、用过和看到过很多随意的脚本。一些人需要半自动化完成任务,于是它们诞生了。一段时间后,它们变得越来越大。它们在一生中可能转手很多次。我常常希望这些脚本提供更多的命令行工具式的感觉。但是,从一次性脚本到合适的工具,真正...
    99+
    2023-05-14
    Python
  • Python将脚本程序转变为可执行程序的实现
    类似Java打包操作,若不想让人看到Python程序内部逻辑,也可将其转换为exe可执行文件首先自己写一个Python程序,如下: print("start running..."...
    99+
    2023-02-15
    Python脚本转变为可执行程序 Python 为可执行程序
  • 实现 Python 脚本生成命令行
    目录Fire使用方法方法支持类支持重新改写有时候我们会有这样的一个需求: 我们定义了一个 Python 的方法,方法接收一些参数,但是调用的时候想将这些参数用命令行暴露出来。 比如说...
    99+
    2024-04-02
  • python脚本实现本地或远程执行命令
    功能:1、执行本地shell命令,执行完成后获取结果2、执行本地shell命令,执行中实时获取输出结果3、执行远程shell命令,执行完成后获取结果4、执行远程shell命令,执行中实时获取输出结果 实际操作:1、安装paramiko ...
    99+
    2023-01-31
    脚本 命令 python
  • 如何实现Python脚本生成命令行
    这篇文章主要讲解了“如何实现Python脚本生成命令行”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现Python脚本生成命令行”吧!有时候我们会有这样的一个需求:我们定义了一个 Py...
    99+
    2023-06-30
  • 用Python实现命令行闹钟脚本实例
    前言: 这篇文章给大家介绍了怎样用python创建一个简单的报警,它可以运行在命令行终端,它需要分钟做为命令行参数,在这个分钟后会打印”wake-up”消息,并响铃报警,你可以用0分钟来测试,它会立即执行,...
    99+
    2022-06-04
    命令行 闹钟 脚本
  • [python] 转换python脚本程
    方法1: freeze.py 来自python源码树. 安装pythonbrew,可安装定制化的独立python环境(略) python trunk/Tools/freeze/freeze.py ./pkgdep.py 之后make即可...
    99+
    2023-01-31
    脚本 python
  • Shell脚本中实现切换用户并执行命令操作
    今天公司同事来找到我说要在服务器上用另外一个用户执行python脚本,但设置到crontab里却老是root用户来执行,为了省事我就想了一个偷懒的办法,就是用shell脚本切换到那个用户,然后去执行那个py...
    99+
    2022-06-04
    脚本 命令 操作
  • H3C交换机python命令下发脚本
    新时代网工编程能力变成比敲命令更重要的能力了,大潮流已经无法改变。最近一直在研究python里面的netmiko作为ssh的方法。把第一个脚本共享出来大家研究一下。 方向比较简单,通过python的open方法读取iplist.txt里面的...
    99+
    2023-01-31
    交换机 脚本 命令
  • shell脚本读取命令行参数的实现
    目录前提选项与参数:一.手工处理方式(已验证)二.getopts/getopt三.总结前提 在编写shell程序时经常需要处理命令行参数 选项与参数: 如下命令行: ./test.sh -f config.con...
    99+
    2022-06-04
    shell 读取命令行参数 shell 命令行参数
  • shell中使用expect命令进行远程执行命令脚本
    expect是用来实现自动交互功能的工具之一,使用expect-send来实现交互过程。 注意: 1、脚本的执行方法与bash shell不一样,比如:expect example.sh 2、向一个脚本传递参数时,bas...
    99+
    2022-06-04
    用expect进行远程执行命令 shell中使用expect命令进行远程执行命令脚本
  • 如何实现python图片格式转换脚本
    这篇文章给大家分享的是有关如何实现python图片格式转换脚本的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.cv2pip install opencv-python之后就可以import cv21.1 导包i...
    99+
    2023-06-22
  • 如何在 Linux 命令行中运行 Python 脚本?
    Python 是一种高级编程语言,被广泛应用于数据科学、机器学习、Web 开发等领域。在 Linux 操作系统中,Python 是一个默认安装的解释器,用户可以通过命令行界面(CLI)来运行 Pyth...
    99+
    2023-09-02
    python linux 开发语言
  • linux中shell脚本实现root切换到普通用户执行脚本或命令的示例分析
    这篇文章将为大家详细讲解有关linux中shell脚本实现root切换到普通用户执行脚本或命令的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。需求:安装deb包,设置程序安装后启动,不需要root...
    99+
    2023-06-09
  • 如何远程执行Linux脚本和命令
    小编给大家分享一下如何远程执行Linux脚本和命令,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!对于 paramiko 安装直接 pip 或者 PyCharm 这...
    99+
    2023-06-16
  • 怎么远程执行Linux脚本和命令
    这篇文章主要介绍“怎么远程执行Linux脚本和命令”,在日常操作中,相信很多人在怎么远程执行Linux脚本和命令问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么远程执行Linux脚本和命令”的疑惑有所帮助!...
    99+
    2023-06-03
  • python淘宝抢购脚本程序实现
    目录一、官网下载火狐浏览器二、下载geckodriver,并解压到火狐浏览器文件夹根目录三、添加火狐浏览器根目录到系统环境变量四、下载并安装python3及pycharm开发工具&n...
    99+
    2024-04-02
  • ssh远程执行命令方法和Shell脚本实例
    写这篇博客之前,我google了一堆相关文章,大都是说修改/etc/sudoers,然后NOPASSWD:指定的cmd,但是真心不管用,没有远程虚拟终端这个方法就是浮云,ubuntu10.04 server...
    99+
    2022-06-04
    脚本 实例 命令
  • hive-shell批量命令执行脚本的实现方法
    如下所示: #!/usr/bin/bash HADOOP_HOME="/opt/module/cdh-5.3.6-ha/hadoop-2.5.0-cdh5.3.6" HIVE_HOME='/opt/module/cd...
    99+
    2022-06-04
    hive shell 命令
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作