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

使用subprocess.getoutput()执行Linux打印机命令时遇语法错误求助

解决Python调用awk命令时的引号语法错误

我有一条能获取打印机名称和IP地址的Linux命令:

lpstat -v | awk '{sub(":", "", $3) sub("ipp://", "", $4) sub("/ipp/print", "", $4); print $3 ", "  $4}'

执行后输出示例:

PRINTER01, 192.168.25.200
PRINTER02, 192.168.24.200
...

尝试用Python的subprocess.getoutput()调用该命令时,写出如下代码:

printers = subprocess.getoutput("lpstat -v | awk '{sub(":", "", $3) sub("ipp://", "", $4) sub("/ipp/print", "", $4); print $3 ", "  $4}'")

但执行时报语法错误:

printers = subprocess.getoutput("lpstat -v | awk '{sub(":", "", $3) sub("ipp://", "", $4) sub("/ipp/print", "", $4); print $3 ", "  $4}'")
                                                            ^
SyntaxError: invalid syntax

问题根源是Python字符串与awk命令中的引号嵌套冲突,以下是几种可行的解决方法:

  • 方法1:转义Python字符串中的双引号
    在Python的双引号外层字符串里,给awk命令内的双引号加上反斜杠转义:
import subprocess

printers = subprocess.getoutput("lpstat -v | awk '{sub(\":\", \"\", $3) sub(\"ipp://\", \"\", $4) sub(\"/ipp/print\", \"\", $4); print $3 \", \"  $4}'")
print(printers)
  • 方法2:用单引号包裹Python字符串
    将外层字符串改为单引号,同时转义awk命令内的单引号;或者直接用双引号包裹awk的动作逻辑,避免单引号冲突:
import subprocess

# 转义awk内的单引号
printers = subprocess.getoutput('lpstat -v | awk \'{sub(":", "", $3) sub("ipp://", "", $4) sub("/ipp/print", "", $4); print $3 ", "  $4}\'')

# 改用双引号包裹awk动作
printers = subprocess.getoutput('lpstat -v | awk "{sub(\":\", \"\", $3) sub(\"ipp://\", \"\", $4) sub(\"/ipp/print\", \"\", $4); print $3 \", \"  $4}"')
  • 方法3:使用Python三引号字符串
    三引号可以直接容纳嵌套的单双引号,无需额外转义:
import subprocess

printers = subprocess.getoutput("""lpstat -v | awk '{sub(":", "", $3) sub("ipp://", "", $4) sub("/ipp/print", "", $4); print $3 ", "  $4}'""")
  • 方法4:避开shell管道,用Python处理逻辑(更推荐)
    不依赖shell的管道功能,直接用Python解析lpstat的输出,既避免引号问题,也更安全:
import subprocess

# 执行lpstat命令获取原始输出
lpstat_result = subprocess.check_output(["lpstat", "-v"], text=True)

# 解析输出提取打印机名称和IP
printer_list = []
for line in lpstat_result.strip().split('\n'):
    segments = line.split()
    if len(segments) >= 4:
        name = segments[2].rstrip(':')
        ip = segments[3].replace('ipp://', '').replace('/ipp/print', '')
        printer_list.append(f"{name}, {ip}")

# 合并结果
final_output = '\n'.join(printer_list)
print(final_output)

内容的提问来源于stack exchange,提问作者crazzyfool

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 17:37:21