我试图在我的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()?
答案 0 :(得分:0)
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
lib(来自标准python lib):
>>> import shlex
>>> shlex.split("python foo.py 'multi word arg'")
['python', 'foo.py', 'multi word arg']