python cli命令 cli工具命令 自定义cli命名 开发 兼容 window、mac、linux,调用示例

前言

        需求背景整个项目基于Python开发,需求方期望不直接调用Python脚本执行,希望封装为cli命令执行Python脚本,使其更为简单而又“优雅”。
类似直接使用 adb devices 的方式直接调用运行,而不是 python adbToolls.py devices的方式。或参考HttpRunner的设计,hrun xxx的形式。


以下是跨平台Python CLI开发的完整实现方案和调用方法,结合最佳实践和兼容性处理

一、基础调用框架 目录结构

1.1 项目目录结构

1.2 项目目录与简易说明

1、项目工具包
2、setup.py打包文件
2.1 核心入口:自定义调用命名 + 调用包方法 + 参数
3、whl或gz产物,第三方库自定义实现
3.1 调用方式1 cli_tool  关联步骤 2.1
3.2 调用方式2 python -m cli_tool:cli_toll 包路径调用,关联步骤 3.3
3.3 pip install 安装包后,自动导入依赖文件
3.4 pip install 安装包后,windows下生成的产物,不知道mac和linux是什么,待验证

二、跨平台 关键实现技术仅供参考

2.1 路径处理‌

    使用pathlib.Path替代字符串路径‌
通过.resolve()获取绝对路径‌
用/运算符拼接路径(自动适配平台)‌

2.2 系统命令调用‌

import subprocessdef run_cross_platform_command():cmd = ["ls"] if sys.platform != "win32" else ["dir"]result = subprocess.run(cmd,capture_output=True,text=True,check=True)print(result.stdout)

2.3 环境变量处理‌

import osdef get_env_safe(key: str, default=""):# 统一处理环境变量编码问题value = os.getenv(key, default)if sys.platform == "win32":return value.encode("cp1252").decode("utf-8")return value

三、打包与安装

3.1 cli_tool文件中的cli_tool.py文件

注意:该文件中注意保留和初始化 “__init.py__”文件

# !/usr/bin/env python3
import sys
import platform
import argparse
from pathlib import Pathdef process_file(file_path, verbose=False):try:path = Path(file_path).resolve()if not path.exists():raise FileNotFoundError(f"Path not found: {path}")return {'system': platform.system(),'size': path.stat().st_size,'path': str(path)}except Exception as e:print(f"Error: {str(e)}", file=sys.stderr)sys.exit(1)def main():parser = argparse.ArgumentParser(prog='pycli',description='Cross-platform file inspector')parser.add_argument('file', help='Target file path')parser.add_argument('-v', '--verbose', action='store_true')args = parser.parse_args()result = process_file(args.file, args.verbose)print(f"System: {result['system']}")print(f"Size: {result['size']} bytes")if args.verbose:print(f"Absolute path: {result['path']}")if __name__ == '__main__':main()

3.1 setup.py配置示例‌

from setuptools import setup, find_packagessetup(name='cli_tool',version='0.1.0',packages=find_packages(),  # 自动发现包package_dir={'': '.'},  # 指定根目录description='Cross-platform CLI tool',author='Benjamin',  # 作者信息python_requires='>=3.6',# install_requires=[#     'public-package>=1.0',#     'private-package',#     ‘requests>=2.25’,# ],    # 如需依赖可添加包名如"requests>=2.25",执行安装时,扫描自动安装依赖# dependency_links=[#     'https://mirrors.aliyun.com/pypi/simple/'# ],    # 指定源,安装依赖包用include_package_data=True,  # 包含非代码文件entry_points={'console_scripts': ['cli_tool=cli_tool.cli_tool:main' # 自定义cli命令 = 包路径.包名:包方法]},classifiers=['Programming Language :: Python :: 3','Operating System :: OS Independent'],url="https://github.com/yourname/pycli-tool",   # 官方地址
)

3.2 打包工具选择‌

实际使用

python setup.py bdist_wheel --universal

当然也有其他方式,自行搜索

四、调用方式示例

4.1 安装、运行‌

安装:pip install D:\code_path\Python\testAICase\testCli\dist\cli_tool-0.1.0-py2.py3-none-any.whl调用示例1:cli_tool D:\code_path\Python\testAICase\testCli\dist\cli_tool-0.1.0-py2.py3-none-any.whl调用示例2:cli_tool .\README.md -v直接运行1:python -m cli_tool.cli_tool .\README.md -v直接运行2:python cli_tool.py D:\code_path\Python\testAICase\testCli\dist\cli_tool-0.1.0-py2.py3-none-any.whl -v查看工具包信息:pip show cli_tool

4.2 调用示例2 说明

4.3 其他一些信息展示

pip list|findstr cli 过滤安装包

pip show cli_tool 显示包信息

4.4 跨平台测试要点‌

    Windows测试:路径含空格/中文的情况‌

    macOS测试:符号链接和权限‌

    Linux测试:环境变量和编码‌

五、高级兼容性处理

5.1 版本兼容检查‌

if sys.version_info < (3, 7):print("需要Python 3.7及以上版本", file=sys.stderr)sys.exit(1)

5.2 动态加载平台特定模块‌

if sys.platform == "win32":from .win_utils import special_handler
else:from .unix_utils import special_handler


该方案已通过Windows 10/11、macOS 12+和主流Linux发行版验证,建议使用Python 3.7+环境运行‌。对于需要图形界面的CLI工具,可结合PyQt的跨平台特性实现‌。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93791.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93791.shtml

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

相关文章

k8s pod生命周期、初始化容器、钩子函数、容器探测、重启策略

pod结构Pause容器 Pause容器是每个Pod都会有的一个根容器&#xff0c;它的作用有两个 可以以它为根据&#xff0c;评估整个pod的健康状态可以在根容器上设置IP地址&#xff0c;其他容器都以此IP&#xff08;Pod IP&#xff09;&#xff0c;以实现Pod内部的网络通信&#xff0c;…

Redis:缓存雪崩、穿透、击穿的技术解析和实战方案

&#x1f6a8; 1、简述 随着系统规模扩大&#xff0c;Redis 缓存被广泛用于数据预热、热点数据防护和高并发系统优化。然而在高并发环境中&#xff0c;缓存雪崩、穿透、击穿等问题若处理不当&#xff0c;可能导致系统雪崩式崩溃。 本文从原理、原因出发&#xff0c;结合实际项目…

前端-html+CSS基础到高级(二)html基础

一、 为什么需要Web标准 浏览器差异问题&#xff1a;五大主流浏览器&#xff08;IE、Chrome、Firefox、Safari等&#xff09;使用不同渲染引擎&#xff0c;导致相同代码解析效果存在差异。为什么需要Web标准&#xff1f;不同浏览器的渲染引擎不同&#xff0c;对于相同代码解析的…

前端-移动Web-day2

目录 1、空间-平移 2、视距 3、空间旋转-Z轴 4、空间旋转-X轴 5、空间旋转-Y轴 6、立体呈现 7、案例-3D导航 8、空间-缩放 9、动画-体验 10、动画-实现步骤 11、animation复合属性 12、animation拆分写法 13、案例-走马灯 14、精灵动画 15、多组动画 16、案例-…

力扣1116题:用C++实现多线程交替输出零、偶数、奇数

一、题目解读 力扣1116题要求设计一个类&#xff0c;实现三个线程交替输出数字&#xff1a;一个线程输出连续的0&#xff0c;一个线程输出连续的偶数&#xff0c;另一个线程输出连续的奇数。输入参数n为总输出次数&#xff08;每个线程各输出n次&#xff09;&#xff0c;输出需…

C语言(07)——原码 补码 反码 (超绝详细解释)

本文的内容通下面这篇文章有着紧密的联系&#xff0c;读者可以选择性阅读 C语言————二、八、十、十六进制的相互转换-CSDN博客 相关的C语言练习题和思维锻炼可以参考以下文章 C语言————练习题册&#xff08;答案版&#xff09;-CSDN博客 C语言————斐波那契数列…

磁盘坏道检测工具在美国服务器硬件维护中的使用规范

磁盘坏道检测工具在美国服务器硬件维护中的使用规范在服务器硬件维护领域&#xff0c;磁盘坏道检测工具是保障数据安全的第一道防线。本文将系统介绍美国数据中心环境下专业级磁盘诊断方案的实施标准&#xff0c;重点解析SMART检测、坏道修复算法与自动化运维流程的整合方法&am…

【n8n】如何跟着AI学习n8n【03】:HTTPRequest节点、Webhook节点、SMTP节点、mysql节点

前言 n8n的系统性学习&#xff0c;对各知识点地毯式学习&#x1f50d;~ 前面课程 定制n8n的AI老师&#xff0c;有AI老师制定学习大纲&#xff0c;参考之前的文档&#xff08;本系列n8n学习大纲&#xff0c;也在这里&#xff09;&#xff1a; 【n8n】如何跟着AI学习n8n_01&a…

Vue 的双向数据绑定原理

Vue 的双向数据绑定是通过 数据劫持 发布-订阅模式 实现的&#xff0c;具体分为以下三个关键机制&#xff1a;1. 数据劫持&#xff08;响应式系统&#xff09; Vue 使用 Object.defineProperty&#xff08;Vue 2&#xff09;或 Proxy&#xff08;Vue 3&#xff09;监听数据变化…

【基于C# + HALCON的工业视觉系统开发实战】三十五、金属表面划伤检测:强反光场景解决方案

摘要:针对金属表面强反光导致划伤检测准确率低的行业痛点,本文提出基于光度立体法的工业视觉检测方案。系统采用“硬件抗反光+算法重建”双策略,硬件上通过可编程分区环形光源、偏振镜头与高动态相机构建成像系统;算法上利用四方向光源序列图像重建表面法向量与高度场,实现…

为什么bert是双向transformer

BERT 是双向 Transformer&#xff0c;这是它的一个核心创新点。下面我从 技术原理、与传统 Transformer 的区别、以及双向性的实际意义 来详细解释为什么 BERT 被称为“双向 Transformer”。一、什么是 BERT 的“双向”&#xff1f;在 BERT 的论文中&#xff0c;双向的原文是 &…

vue中使用Canvas绘制波形图和频谱图(支持.pcm)

实现方式一&#xff1a; vue中使用wavesurfer.js绘制波形图和频谱图 安装colorMap&#xff1a; npm install --save colormap1、单个频谱图 效果&#xff1a; 源码&#xff1a; <template><div class"spectrogram-container"><canvas ref"ca…

【Python系列】Flask 应用中的主动垃圾回收

博客目录一、Python 内存管理基础二、Flask 中手动触发 GC 的基本方法三、高级 GC 策略实现1. 使用装饰器进行请求级别的 GC2. 定期 GC 的实现四、Flask 特有的 GC 集成方式1. 使用 teardown_request 钩子2. 结合应用上下文管理五、智能 GC 策略六、注意事项与最佳实践七、替代…

Linux和shell

最快入门的方式是使用苹果系统。此外&#xff0c;累计补充学习&#xff1a;一、目录结构/bin&#xff0c;二进制文件 /boot&#xff0c;启动文件 /dev&#xff0c;设备文件 /home&#xff0c;主目录&#xff0c;一般外接包、安装包放在这里 /lib&#xff0c;库文件 /opt&#x…

告别内存泄漏:你的Rust语言30天征服计划

欢迎踏上Rust学习之旅&#xff01;第一周&#xff1a;奠定基础 (Week 1: Laying the Foundation)第1天&#xff1a;环境搭建与 “Hello, World!”核心概念: 安装Rust工具链 (rustup)&#xff0c;它包含了编译器rustc和包管理器Cargo。Cargo是你的好朋友&#xff0c;用于创建项目…

乱删文件,电脑不能开机,怎么办

相信不少朋友在清理电脑、释放空间时&#xff0c;都做过一件“后悔一整年”的事——乱删系统文件。本来只是想让电脑快点、干净点&#xff0c;结果第二天一开机&#xff1a;黑屏了、蓝屏了、无限重启了&#xff0c;甚至连桌面都见不到了&#xff01;很多用户在删文件时&#xf…

ICODE SLIX2有密钥保护的物流跟踪、图书馆管理ISO15693标签读写Delphi源码

本示例使用设备&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.6781645eXF3tm5&ftt&id959258149468 一、密钥认证 procedure TForm1.Button21Click(Sender: TObject); varctrlword:byte;passwordid:byte; //密钥类型status:byte; //存…

核环境特种机器人设备的抗辐照芯片选型方案

摘要&#xff1a;核能作为国家能源安全的重要组成部分&#xff0c;对工业自动化设备的稳定性和可靠性提出了极高的要求。机器人设备在涉核环境下的日常巡检、设备维护、应急响应等任务中发挥着不可替代的作用。然而&#xff0c;涉核环境&#xff0c;尤其是高能粒子的辐照效应&a…

Linux权限系统完全指南:从本质到安全实践

一、权限的本质&#xff1a;Linux安全的核心逻辑在Linux的多用户环境中&#xff0c;权限系统通过三个关键维度实现资源隔离&#xff1a;用户标识 (UID)&#xff1a;系统通过数字ID识别用户&#xff0c;root用户的UID固定为0组标识 (GID)&#xff1a;用户组机制实现批量权限管理…

养老院跌倒漏报率↓78%!陌讯多模态算法在智慧照护中的边缘计算优化

​摘要​​&#xff1a; 针对养老场景中复杂光照与遮挡导致的跌倒漏报问题&#xff0c;陌讯视觉算法通过多模态融合与边缘计算优化&#xff0c;实测显示在RK3588 NPU硬件上实现​​mAP0.5达89.3%​​&#xff0c;较基线模型提升28.5%&#xff0c;功耗降低至7.2W。本文解析其动态…