python 子进程的Linux命令.getoutput()获取无效语法

6qfn3psc  于 2023-06-20  发布在  Python
关注(0)|答案(2)|浏览(122)

我有一个命令,拉打印机名称沿着IP地址的列表:

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
...

我尝试使用subprocess.getoutput()将这些信息拉入Python,如下所示:

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

有人知道如何实现我正在努力做的事情吗?
谢谢

von4xj4u

von4xj4u1#

subprocess.getoutput()的参数中

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

每个双引号开始或结束一个字符串,导致一个字符串后跟一个冒号。
"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}'")

如果你用单引号替换外面的双引号,你只需要转义两个单引号。

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

s4chpxco2#

正如你所注意到的,报价是问题所在。Python将最接近的未转义匹配引号匹配为关闭:

t1 = "ab"cd'ef" # wrong syntax, adding this to fix syntax highlight on SO -> '
t2 = "ab\"cd'ef" # ok
t3 = 'ab"cd'ef' # wrong syntax, adding this to fix syntax highlight on SO -> '
t4 = 'ab"cd\'ef' # ok, t2 == t4

这在某些时候会变得很烦人,但是简单的单引号和双引号并不是编写Python字符串的唯一方法--你可以在同一行中使用多行字符串的强大功能!多行字符串是由三个相同的引号字符组成的,所以字符串主体中的单个字符不会破坏它!

t5 = '''ab"cd'ef''' # works, t2 == t5
t6 = """ab"cd'ef""" # works, t2 == t6

所以你可以

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

相关问题