前言
? ? ? ? 需求背景整個項目基于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的跨平臺特性實現?。