当前位置: 首页 > news >正文

用Python打造自己的专属命令行工具

在日常的开发和使用过程中,我们常常会编写一些实用的Python脚本,比如用来批量处理文件、获取系统信息等。然而,每次都要输入python script_name.py来运行脚本,时间一长难免觉得繁琐。要是能像使用系统自带的命令(如lscd)一样,直接在命令行输入自定义的命令就能执行脚本,那该多方便!实际上,通过几个简单的步骤,我们就能将Python脚本变成真正的命令行命令,大幅提升使用效率。

就像类 Unix 系统中常用的wc -l命令用于统计文件行数一样,接下来,我将通过创建一个功能与之等同的自定义命令count_lines ,分别在类 Unix 系统(如 Linux、macOS)和 Windows 系统中展开讲解,详细说明将 Python 脚本变为命令行命令的实现过程。

案例脚本准备

我们先编写一个简单的Python脚本count_lines.py,它的功能是读取指定文本文件,并输出文件的行数。代码如下:

import sysif len(sys.argv) < 2:print("请输入要统计行数的文件路径")sys.exit(1)file_path = sys.argv[1]
try:with open(file_path, 'r', encoding='utf-8') as file:lines = file.readlines()print(f"文件 {file_path} 的行数为: {len(lines)}")
except FileNotFoundError:print(f"文件 {file_path} 不存在")

目前,我们可以通过python count_lines.py test.txt(假设test.txt是要统计行数的文件)来运行这个脚本。

$ python count_lines.py test.txt
文件 test.py 的行数为: 177

但是这明显不够便捷。接下来,我们就一步步把它变成真正的命令行命令。

一. 类Unix系统实现步骤

步骤一:赋予脚本可执行权限

在类Unix系统(如Linux、macOS)中,文件默认是没有可执行权限的。我们需要使用chmod命令为脚本赋予可执行权限,具体操作如下:

$ chmod +x count_lines.py

执行完上述命令后,count_lines.py就具备了可执行属性。此时,我们可以尝试运行脚本,但需要注意,由于当前目录默认不在系统的PATH环境变量中,我们需要使用相对路径来运行,即:

$./count_lines.py test.txt

不过,直接运行可能会遇到错误,因为系统此时还不知道该用Python解释器来执行这个脚本,它会尝试以Shell脚本的方式去执行,从而导致语法错误。别担心,我们接着进行下一步操作。

步骤二:添加解释器shebang

Shebang(也称为Hashbang)是一个特殊的符号,它的作用是告诉系统应该使用哪个解释器来执行脚本。对于Python脚本,我们通常添加#!/usr/bin/env python这一行作为脚本的第一行。使用env的好处在于,它可以根据系统的PATH环境变量找到正确的Python解释器,避免了因Python安装路径不同而导致的问题。

修改后的count_lines.py脚本如下:

#!/usr/bin/env python
import sysif len(sys.argv) < 2:print("请输入要统计行数的文件路径")sys.exit(1)file_path = sys.argv[1]
try:with open(file_path, 'r', encoding='utf-8') as file:lines = file.readlines()print(f"文件 {file_path} 的行数为: {len(lines)}")
except FileNotFoundError:print(f"文件 {file_path} 不存在")

添加完Shebang后,我们再次尝试运行脚本:

$./count_lines.py test.txt

此时,脚本就能正常运行了。而且,我们还可以去掉脚本的.py扩展名,让它看起来更像一个系统命令:

$ mv count_lines.py count_lines
$./count_lines test.txt

步骤三:将命令添加到PATH环境变量

虽然现在我们可以通过./count_lines来运行脚本,但还是不够方便,因为必须在脚本所在的目录下执行。为了能在任意目录下都能运行这个命令,我们需要将脚本所在的目录添加到系统的PATH环境变量中。

不建议直接将脚本复制到系统级的目录(如/usr/bin/usr/local/bin),因为这样可能会引发命名冲突,甚至影响系统稳定性。比较好的做法是在用户主目录下创建一个bin目录,然后将脚本复制到该目录,并将bin目录添加到PATH中。

  1. 创建bin目录
$ mkdir -p ~/bin
  1. 复制脚本到bin目录
$ cp count_lines ~/bin
  1. 临时添加bin目录到PATH(仅对当前会话有效)
$ export PATH=$PATH:$HOME/bin

如果希望设置永久生效,需要将上述命令添加到用户主目录下的.profile.bash_profile文件中。以.bash_profile为例,使用文本编辑器打开该文件:

$ vi ~/.bash_profile

在文件末尾添加以下内容:

export PATH=$PATH:$HOME/bin

保存并关闭文件后,执行source ~/.bash_profile使配置立即生效。

完成上述步骤后,我们就可以在任意目录下,像使用系统命令一样,直接输入count_lines test.txt来统计文件行数了。

二. Windows系统实现步骤

在Windows系统中,将Python脚本变成命令行命令的方式与类Unix系统有所不同,主要通过以下几个步骤来实现:

步骤一:创建批处理文件

批处理文件(.bat)是Windows系统中用于自动执行一系列命令的文件。我们可以创建一个批处理文件,在其中指定使用Python解释器来运行我们的脚本。在脚本count_lines.py所在的目录下,新建一个文本文件,命名为count_lines.bat,使用文本编辑器打开,并添加以下内容:

@echo off
python count_lines.py %*

@echo off用于关闭批处理文件执行过程中的命令回显,让界面更加简洁。python count_lines.py %*表示使用Python解释器运行count_lines.py脚本,并将命令行中输入的参数传递给脚本。

步骤二:配置环境变量

为了能在任意目录下运行count_lines.bat,我们需要将其所在目录添加到系统的环境变量中。具体操作如下:

  1. 打开“系统属性”:右键点击“此电脑”,选择“属性”,在弹出的窗口中点击“高级系统设置”。

  2. 进入“环境变量”设置:在“系统属性”窗口的“高级”选项卡中,点击“环境变量”按钮。
    请添加图片描述

  3. 编辑Path环境变量:在“系统变量”列表中找到Path变量,点击“编辑”。

  4. 添加路径:点击“新建”,输入count_lines.bat所在的目录路径(例如C:\scripts,根据实际情况填写),然后点击“确定”保存设置。

步骤三:测试命令

完成环境变量配置后,打开命令提示符(CMD)或PowerShell,在任意目录下输入count_lines.bat test.txt,即可运行脚本统计文件行数。如果希望直接输入count_lines test.txt就能运行,可以将count_lines.bat改名为count_lines(去掉.bat扩展名),不过需要注意,这样可能会与系统中其他同名文件或命令产生冲突,操作时需谨慎。

PS E:\> count_lines test.txt
文件 test.py 的行数为: 177

通过以上步骤,无论是在类Unix系统还是Windows系统中,我们都成功将Python脚本变成了便捷的命令行命令。当然,Python在命令行工具开发方面的潜力远不止于此。利用clickargparse等强大的库,我们还能开发出功能更丰富、交互更友好的命令行应用。后续,我也会分享更多关于Python命令行工具开发的进阶内容,帮助大家打造出更专业、更实用的工具。如果你在实践过程中遇到任何问题,欢迎随时交流讨论!

http://www.xdnf.cn/news/289315.html

相关文章:

  • 手写 Vue 源码 === reactive 方法
  • 判断题材持续性
  • Redis的过期设置和策略
  • rocketMq win10安装并注册服务 centos7安装
  • 嵌软笔记名词汇总
  • C++基础知识1:内建数据类型 vs 自定义数据类型
  • 豆包多轮对话优化策略:上下文理解与记忆,意图识别,对话管理
  • 力扣每日一题1128等价多米诺骨牌对的数量
  • C++和Lua混和调用
  • 什么是加油站专用可燃气体磁吸无线检测探测器
  • 小米刷新率 2.4 | 突破屏幕刷新率限制,享受更流畅视觉体验的应用程序
  • 《类和对象(上)》
  • 架构思维:构建高并发读服务_基于流量回放实现读服务的自动化测试回归方案
  • 直方图比较
  • SecureCRT 使用指南:安装、设置与高效操作
  • springboot+mysql+element-plus+vue完整实现汽车租赁系统
  • 文本三剑客试题
  • 【Elasticsearch入门到落地】12、索引库删除判断以及文档增删改查
  • 【Leetcode 每日一题 - 补卡】1128. 等价多米诺骨牌对的数量
  • 【Unity】AssetBundle热更新
  • Java中线程间数据共享:ThreadLocal与ScopedValue
  • 二、【LLaMA-Factory实战】数据工程全流程:从格式规范到高质量数据集构建
  • Qt 显示QRegExp 和 QtXml 不存在问题
  • 线程池配置不合理:系统性能的隐形杀手(深度解析版)
  • Python基本环境搭配
  • 代码随想录第32天:动态规划5(组合、排列、最小方法数)
  • 二、Python变量基础(2)
  • STM32 PulseSensor心跳传感器驱动代码
  • 常用非对称加密算法的Python实现及详解
  • simulink使能子系统的四种配置