首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python subprocess.Popen()中传递带有两个引号的shell命令

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

Stack Overflow用户
提问于 2020-02-13 10:40:15
回答 1查看 221关注 0票数 0

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

代码语言:javascript
复制
iostat -d 7 7 -p sda | awk '!/^Device/' | awk '!/^Linux/'

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

代码语言:javascript
复制
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连接时,我得到的不是空白,而是:

代码语言:javascript
复制
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()?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-13 10:54:38

  1. 您不需要添加额外的引号,因为subprocess会在需要时自动添加它们。

代码语言:javascript
复制
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. As @noufal指针输出|并不是这样工作的。您需要传输命令:

代码语言:javascript
复制
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 ):

代码语言:javascript
复制
>>> import shlex
>>> shlex.split("python foo.py 'multi word arg'")
['python', 'foo.py', 'multi word arg']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60205867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档