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
英文地址,請注明出處:http://en.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。本文解析其動態…