我试图在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()?
发布于 2020-02-13 10:54:38
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|并不是这样工作的。您需要传输命令: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']https://stackoverflow.com/questions/60205867
复制相似问题