用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.mzph.cn/pingmian/79569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【KWDB 创作者计划】KWDB 2.2.0多模融合架构与分布式时序引擎

KWDB介绍 KWDB数据库是由开放原子开源基金会孵化的分布式多模数据库&#xff0c;专为AIoT场景设计&#xff0c;支持时序数据、关系数据和非结构化数据的统一管理。其核心架构采用多模融合引擎&#xff0c;集成列式时序存储、行式关系存储及自适应查询优化器&#xff0c;实现跨模…

学习Linux的第二天

如何在Linux环境下做开发 Linux的一些基操 Tips&#xff1a;平常最表层的是命令行模式&#xff0c;最多见这个默认叫做命令行模式 Vi操作是什么意思呢 就是在提示符输入vi a.c 是可以创建一个a.c这个文件并进入这个输入模式 按i可以输入代码 要退出的时候按esc 再按:(冒号…

链表操作练习

要求 现在有一个双向链表&#xff0c;里面要保存歌曲的名字&#xff1b;例如 蔡琴/渡口.mp3 我们把它定义在一个link.h文件中。 #ifndef LINK_H #define LINK_H #include <stdlib.h> #include <stdio.h> #include <string.h>typedef struct Node {//保存歌…

MATLAB制作散点图:从基础到进阶的三种类型讲解

一、什么是散点图 散点图是一种用来展示两个或多个变量之间关系的图表形式。它可以帮助我们直观地观察变量之间是否存在相关性、趋势或异常值&#xff0c;常用于数据分析的初步探索阶段。 二、三种类型散点图 1. 基本二维散点图&#xff1a;最简单、最常用 基本二维散点图的…

模块方法模式(Module Method Pattern)

&#x1f9e0; 模块方法模式&#xff08;Module Method Pattern&#xff09; 模块方法模式是一种结构型设计模式&#xff0c;它将复杂的操作分解成一系列相对简单、独立且单一职责的模块。每个模块负责完成一种具体的操作&#xff0c;其他模块或系统可以通过调用这些模块的公开…

Python中的JSON库,详细介绍与代码示例

目录 1. 前言 2. json 库基本概念 3. json 的适应场景 4. json 库的基本用法 4.1 导 json入 模块 4.2 将 Python 对象转换为 JSON 字符串 4.3 将 JSON 字符串转换为 Python 对象 4.4 将 Python 对象写入 JSON 文件 4.5 从 JSON 文件读取数据 4.6 json 的其他方法 5.…

网狐旗舰大联盟组件源码私测笔记:结构分层、UI重构与本地实操全流程

作为一套衍生于传统网狐架构的源码版本&#xff0c;大联盟这套源码组件可谓是在经典基础上进行了深度重塑。与老版死板的框架风格不同&#xff0c;它不仅对界面做了大刀阔斧的重构&#xff0c;还在组件层级的组织上做了优化。本文将基于一整套源码进行深度解析&#xff0c;强调…

STM32 PulseSensor心跳传感器驱动代码

STM32CubeMX中准备工作&#xff1a; 1、设置AD 通道 2、设置一个定时器中断&#xff0c;间隔时间2ms&#xff0c;我这里采用的是定时器7 3、代码优化01 PulseSensor.c文件 #include "main.h" #include "PulseSensor/PulseSensor.h"/******************…

C++项目容易犯错的点

1. 矩阵q要先定义大小&#xff0c;再赋值。不可以直接赋值。下面这种方式是错误的Eigen::MatrixXd q&#xff1b;q<<1,2&#xff1b;正确的这样的&#xff1a; Eigen::MatrixXd q(2,1); q<<1.4, 1.5; 2. 不要重复加载variables.h头文件&#xff0c;这样变量会被…

在阿里云 Ubuntu 24.04 上部署 RabbitMQ:一篇实战指南

前言 RabbitMQ 是业界常用的开源消息中间件,支持 AMQP 协议,易于部署、高可用、插件丰富。本文以阿里云 ECS 上运行的 Ubuntu 24.04 LTS 为例,手把手带你完成 RabbitMQ 从仓库配置到运行的全流程,并分享在国内环境下常见的坑与对应解决方案。 环境概况 操作系统:Ubuntu …

【论文笔记】SOTR: Segmenting Objects with Transformers

【题目】&#xff1a;SOTR: Segmenting Objects with Transformers 【引用格式】&#xff1a;Guo R, Niu D, Qu L, et al. Sotr: Segmenting objects with transformers[C]//Proceedings of the IEEE/CVF international conference on computer vision. 2021: 7157-7166. 【网…

MinIO实现https访问

Windows下实现MinIO的https访问. 首先需要自己解决证书问题, 这里可以是个人证书 也可以是花钱买的证书. 现在使用个人开发者证书举例子。 将证书数据解压到你知道的目录之下 然后直接使用命令启动MinIO start minio.exe server --certs-dir D:\xxxxx\tools\certs …

基于 jQuery 实现灵活可配置的输入框验证功能

在 Web 表单开发中&#xff0c;输入框验证是保障数据准确性和安全性的关键环节。无论是用户注册、信息提交还是数据录入场景&#xff0c;都需要对用户输入内容进行合法性检查。本文将介绍如何使用 HTML、CSS 和 jQuery 构建一个可灵活配置的输入框验证系统&#xff0c;轻松应对…

Kotlin 04Flow stateIn 和 shareIn的区别

一 Kotlin Flow 中的 stateIn 和 shareIn 一、简单比喻理解 想象一个水龙头&#xff08;数据源&#xff09;和几个水杯&#xff08;数据接收者&#xff09;&#xff1a; 普通 Flow&#xff08;冷流&#xff09;&#xff1a;每个水杯来接水时&#xff0c;都要重新打开水龙头从…

WebRTC 服务器之SRS服务器概述和环境搭建

1.概述 SRS&#xff08;Simple Realtime Server&#xff09;是一款高性能、跨平台的流媒体服务器&#xff0c;支持多种协议&#xff0c;包括 RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH 和 GB28181。本文介绍了 SRS&#xff0c;包括其用途、关键功能、架构和支持协议。SRS 旨…

Dify - Embedding Rerank

注意&#xff1a;v100显卡会出现不适配&#xff0c;不推荐使用 1. 安装 Docker ubuntu 22.04 docker 安装&使用_ubuntu22.04 安装docker-CSDN博客 2. 安装vllm pip install -U xformers torch torchvision torchaudio triton --index-url https://download.pytorch.org/w…

LeetCode:链表的中间结点

1、题目描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间结点&#xff…

LabVIEW温控系统热敏电阻滞后问题

在 LabVIEW 构建的温控系统中&#xff0c;热敏电阻因热时间常数大&#xff08;2 秒左右&#xff09;产生的滞后效应&#xff0c;致使控温出现超调与波动。在不更换传感器的前提下&#xff0c;可从算法优化、硬件调整和系统设计等维度着手解决。 ​ 一、算法优化​ 1. 改进 PI…

技术犯规计入个人犯规吗·棒球1号位

在棒球运动中&#xff0c;虽然没有“技术犯规”这一特定术语&#xff0c;但存在多种违规行为或违反规则的情况&#xff0c;通常会导致判罚或处罚。以下是常见的违规行为及相关规则&#xff1a; 1. 投手违规&#xff08;Balk&#xff09; 定义&#xff1a;投手在垒上有跑垒员时…

Python核心技巧 类与实例:面向对象编程的基石

、核心概念图解 &#x1f3af; 类 vs 实例 类&#xff1a;对象的蓝图&#xff08;如"汽车设计图"&#xff09; 实例&#xff1a;类的具体实现&#xff08;如"你的特斯拉Model 3"&#xff09; class MyClass: # 类声明 count 0 # 类…