使用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
相关产品推荐
相关产品推荐

