我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

在我的职业生涯中,我写过、用过和看到过很多随意的脚本。一些人需要半自动化完成任务,于是它们诞生了。一段时间后,它们变得越来越大。它们在一生中可能转手很多次。我常常希望这些脚本提供更多的 命令行工具式 的感觉。但是,从一次性脚本到合适的工具,真正提高质量水平有多难呢?事实证明这在 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脚本转命令行的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python将脚本程序转变为可执行程序的实现

本文主要介绍了Python将脚本程序转变为可执行程序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-15

python脚本实现本地或远程执行命令

功能:1、执行本地shell命令,执行完成后获取结果2、执行本地shell命令,执行中实时获取输出结果3、执行远程shell命令,执行完成后获取结果4、执行远程shell命令,执行中实时获取输出结果 实际操作:1、安装paramikoap
2023-01-31

如何实现Python脚本生成命令行

这篇文章主要讲解了“如何实现Python脚本生成命令行”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现Python脚本生成命令行”吧!有时候我们会有这样的一个需求:我们定义了一个 Py
2023-06-30

用Python实现命令行闹钟脚本实例

前言: 这篇文章给大家介绍了怎样用python创建一个简单的报警,它可以运行在命令行终端,它需要分钟做为命令行参数,在这个分钟后会打印”wake-up”消息,并响铃报警,你可以用0分钟来测试,它会立即执行,用扬声器控制面板调整声音。 以下是
2022-06-04

Shell脚本中实现切换用户并执行命令操作

今天公司同事来找到我说要在服务器上用另外一个用户执行python脚本,但设置到crontab里却老是root用户来执行,为了省事我就想了一个偷懒的办法,就是用shell脚本切换到那个用户,然后去执行那个python脚本.好了,这篇文章我只演
2022-06-04

shell脚本读取命令行参数的实现

目录前提选项与参数:一.手工处理方式(已验证)二.getopts/getopt三.总结前提在编写shell程序时经常需要处理命令行参数 选项与参数:如下命令行:./test.sh -f config.conf -v --prefix=/ho
2022-06-04

如何实现python图片格式转换脚本

这篇文章给大家分享的是有关如何实现python图片格式转换脚本的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.cv2pip install opencv-python之后就可以import cv21.1 导包i
2023-06-22

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/cdh-5.3.6-ha/hi
2022-06-04

linux中shell脚本实现root切换到普通用户执行脚本或命令的示例分析

这篇文章将为大家详细讲解有关linux中shell脚本实现root切换到普通用户执行脚本或命令的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。需求:安装deb包,设置程序安装后启动,不需要root
2023-06-09

ssh远程执行命令方法和Shell脚本实例

写这篇博客之前,我google了一堆相关文章,大都是说修改/etc/sudoers,然后NOPASSWD:指定的cmd,但是真心不管用,没有远程虚拟终端这个方法就是浮云,ubuntu10.04 server 亲测!! ssh执行远程操作 命
2022-06-04

使用Python脚本和ADB命令实现卸载App

前言 本文实现一个 Python 脚本,用来批量卸载模拟器或者实体机上面的 App 以及清除 LogCat 缓存。 开发 Android 的朋友,模拟器或者手机里面常常有大量调试的 Demo,对于手机来说还好,可是对于模拟器,有可能就会造成
2022-06-04

Python远程linux执行命令实现

1、远程登录到linux上,使用到的模块paramiko#远程登陆操作系统 def ssh(sys_ip,username,password,cmds):try#创建ssh客户端client = paramiko.SSHClient()#第
2022-06-04

在Linux命令行内如何实现大小写转换

这篇文章主要介绍在Linux命令行内如何实现大小写转换,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!tr 命令tr (translate) 是能运用在命令行或者脚本上的最简单的大小写转换命令之一。例如如果你想要让一
2023-06-15

shell脚本如何实现同时多台远程主机执行命令

这篇文章主要介绍shell脚本如何实现同时多台远程主机执行命令,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实现需求在对单台机器做操作时我们会用“ssh ip”的方式登录到机器上,可以写这样一个工具vssh ip1,
2023-06-09

使用PyInstaller将Python程序文件转换为可执行程序文件

Windows下采用PyInstall将py文件转换成exe可执行文件 好不容易写完的py文件,想做成exe文件,最开始选择用py2exe,结果生成的exe遇到两个问题, 1. py程序里print 的信息,cmd中执行tool后并没有显示
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录