用两个带引号的单词在python subprocess.Popen()中传递shell命令

时间:2020-02-13 10:40:15

标签: python subprocess

我试图在我的python代码中运行下一个命令:

iostat -d 7 7 -p sda | awk '!/^Device/' | awk '!/^Linux/'

到目前为止,我尝试的方式是:

command = ["iostat", "-d", "7", "7", "-p", "sda", "|", "awk", "'!/^Device/'", "|", "awk", "'!/^Linux/'"]
device = subprocess.Popen(command, stdout=subprocess.PIPE)
devicetr = device.stdout.read()

似乎该代码无法按预期处理"'!/^Device/'""'!/^Linux/'"之类的'!/^Device/''!/^Linux/'中的引号。

当没有USB连接时,我得到的不是空白:

Linux 4.14.98-v7+   01/28/2020  _armv7l_    (4 CPU)

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn

已尝试添加'\'并且这样做: Passing double quote shell commands in python to subprocess.Popen()?

1 个答案:

答案 0 :(得分:0)

  1. 您不需要添加其他引号,因为subprocess会在需要时自动添加。
command = ["iostat", "-d", "7", "7", "-p", "sda", "|", "awk", "!/^Device/", "|", "awk", "!/^Linux/"]
device = subprocess.Popen(command, stdout=subprocess.PIPE)
devicetr = device.stdout.read()  # also here was a typo red -> read
  1. 由于@ noufal-ibrahim指针|不能这样工作。您需要传递命令:
ps1 = subprocess.Popen(["iostat"], stdout=subprocess.PIPE)
ps2 = subprocess.Popen(["awk",  "!/^ *KB/"], stdin=ps1.stdout, stdout=subprocess.PIPE)  # filter out line with KB and extra space
print(ps2.stdout.read().decode())

^此代码可在我的机器上使用,您可以根据自己的用例进行调整。

附录。而且,除了手动创建命令列表之外,您还可以使用shlex lib(来自标准python lib):

>>> import shlex
>>> shlex.split("python foo.py 'multi word arg'")
['python', 'foo.py', 'multi word arg']
相关问题