首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python中的管道执行shell命令

用Python中的管道执行shell命令
EN

Stack Overflow用户
提问于 2016-12-20 08:58:42
回答 4查看 6.8K关注 0票数 3

我是Python新手,试过谷歌搜索,但没有帮助.

我需要在管道中调用这些命令(从mailq获取最古老的挂起邮件):

代码语言:javascript
复制
mailq |grep "^[A-F0-9]" |sort -k5n -k6n |head -n 1

该命令在shell中工作。

在Python中,我写了以下内容:

代码语言:javascript
复制
 p = subprocess.Popen( 'mailq |grep \"^[A-F0-9]\" |sort -k5n -k6n |head -n 1', shell=True,
                         stdin=subprocess.PIPE,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)
 response = p.communicate()[0]

但是我得到了这样的输出:

排序:写入失败:标准输出:断开管道\n排序:写入错误\n

想知道是什么导致了这样的错误?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-12-20 09:12:03

我认为这应该是可行的:

代码语言:javascript
复制
p = subprocess.Popen( 'mailq |grep \"^[A-F0-9]\" |sort -k5n -k6n |head -n 1', shell=True,
                         stdin=subprocess.PIPE,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE)
response = p.stdout.readlines(-1)[0]
print response

打印响应的第一行。

票数 5
EN

Stack Overflow用户

发布于 2016-12-20 09:05:25

与其让shell负责将命令拆分为多个进程并对它们进行管道处理,不如自己动手。请参见here如何将一个子进程流输送到另一个子进程。

这样,您就可以查找每个步骤的输出(例如,将stdout路由到您的stdout,只是为了调试),并确定您的整个工作流是否正常。

它看起来有点像这样:

代码语言:javascript
复制
mail_process = subprocess.Popen('mailq', stdin=PIPE, stdout=PIPE, stderr=STDOUT)
grep_process = subprocess.Popen(['grep', '\"^[A-F0-9]"'], stdin=mail_process.stdout, stdout=PIPE, stderr=STDOUT]
...
head_process = subprocess.Popen(["head", ...], ...)
head_process.communicate()[0]
票数 2
EN

Stack Overflow用户

发布于 2016-12-20 09:05:47

我建议您使用下面所写的子进程:http://kendriu.com/how-to-use-pipes-in-python-subprocesspopen-objects

代码语言:javascript
复制
ls = subprocess.Popen('ls /etc'.split(), stdout=subprocess.PIPE)
grep = subprocess.Popen('grep ntp'.split(), stdin=ls.stdout, stdout=subprocess.PIPE)
output = grep.communicate()[0]

这是使用管道的节奏式方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41238273

复制
相关文章

相似问题

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