You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:01:04