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

2024-10-02 12:23:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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()?


Tags: 代码readkblinuxdevicestdoutcommandsubprocess
1条回答
网友
1楼 · 发布于 2024-10-02 12:23:56
  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 pointer out |不以这种方式工作。您需要通过管道传输命令:
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库(来自标准python库),而不是手动创建命令列表:

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

相关问题 更多 >

    热门问题