如何用Python处理Linux命令输出及批量执行lpadmin命令
解决Python处理Linux CUPS命令的两个问题
1. 解析lpstat -v输出,提取打印机信息并生成DataFrame
不用依赖管道命令,直接用Python处理输出即可,步骤如下:
import subprocess import pandas as pd # 获取lpstat输出并解码为字符串 output = subprocess.check_output(["lpstat", "-v"], encoding="utf-8") # 按行拆分输出 lines = output.strip().split("\n") printer_data = [] for line in lines: parts = line.split() if len(parts) < 3: continue # 跳过无效行 # 提取打印机名(对应awk '{print $3}',去掉末尾的冒号) printer_name = parts[2].rstrip(":") # 提取IP地址(从设备URI中拆分) device_uri = parts[3] ip = device_uri.replace("socket://", "") if device_uri.startswith("socket://") else "未知" printer_data.append({"打印机名": printer_name, "IP地址": ip}) # 生成DataFrame df = pd.DataFrame(printer_data) print(df)
这段代码直接替代了lpstat -v | awk '{print $3}' | sed 's/://g'的逻辑,还额外提取了IP地址并生成结构化的DataFrame。
2. 批量执行lpadmin命令(避免整行字符串报错)
subprocess执行命令时,直接传整行字符串容易因空格、特殊字符报错,正确做法是将命令拆分为参数列表,批量处理示例如下:
场景1:已有打印机名+IP的结构化列表(从Google Sheets获取的格式)
import subprocess # 假设这是从Google Sheets获取的打印机信息列表 printer_list = [ {"name": "Office-Printer-1", "ip": "192.168.1.100"}, {"name": "Warehouse-Printer-2", "ip": "192.168.1.101"} ] for printer in printer_list: # 构建参数列表,每个选项和对应值单独作为列表元素 cmd_args = [ "lpadmin", "-p", printer["name"], "-E", "-v", f"socket://{printer['ip']}", "-m", "everywhere" # 可根据实际需求替换为对应驱动 ] try: subprocess.check_call(cmd_args) print(f"✅ 成功添加打印机:{printer['name']}") except subprocess.CalledProcessError as e: print(f"❌ 添加打印机{printer['name']}失败:{e}")
场景2:已有整行命令字符串列表
如果已经生成了整行的lpadmin命令字符串,可以用shlex.split()安全拆分参数:
import subprocess import shlex # 假设这是已构建好的命令字符串列表 cmd_strings = [ "lpadmin -p Office-Printer-1 -E -v socket://192.168.1.100 -m everywhere", "lpadmin -p Warehouse-Printer-2 -E -v socket://192.168.1.101 -m everywhere" ] for cmd_str in cmd_strings: cmd_args = shlex.split(cmd_str) try: subprocess.check_call(cmd_args) print(f"✅ 成功执行命令:{cmd_str}") except subprocess.CalledProcessError as e: print(f"❌ 执行命令失败:{cmd_str},错误信息:{e}")
内容的提问来源于stack exchange,提问作者crazzyfool
相关产品推荐
相关产品推荐

