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

时间:2016-12-20 08:58:42

标签: python pipe stdout mail-queue

我是Python新手,尝试谷歌搜索,但没有帮助..
我需要在管道中调用这些命令(从mailq获取最旧的待处理邮件):

mailq |grep "^[A-F0-9]" |sort -k5n -k6n |head -n 1

该命令在shell中运行。

在Python中我写了以下内容:

 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]

但我得到了这样的结果:

  

排序:写入失败:标准输出:管道损坏\ nsort:写入错误\ n

想知道造成这种错误的原因是什么?

4 个答案:

答案 0 :(得分:2)

我认为这应该有效:

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

打印响应的第一行

答案 1 :(得分:1)

不要让shell负责将命令拆分为多个进程并管理它们,而是自己动手。请参阅here如何将一个子流程流传输到另一个子流程。

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

看起来有点像这样:

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 :(得分:0)

我建议您使用此处编写的子流程:http://kendriu.com/how-to-use-pipes-in-python-subprocesspopen-objects

conf.set("yarn.resourcemanager.address", "127.0.0.1:8032"); 
conf.set("mapreduce.framework.name", "yarn");
conf.set("fs.default.name", "hdfs://127.0.0.1:9000");
conf.set("mapreduce.job.jar",".\\target\\wc-mvn-0.0.1-SNAPSHOT.jar");

这是使用管道的pythonic方式。

答案 3 :(得分:0)

Python3

shell = subprocess.run(["./snmp.sh","10.117.11.55","1.3.6.1.4.1.43356.2.1.2.1.1.0"],check=True,capture_output=True)
print(shell)

外壳

#!/bin/bash
args=("$@")

snmpwalk -v 1 -c public ${args[0]} ${args[1]}
output = subprocess.check_output(["awk",'{print$4}'"],input=shell.stdout,capture_output=True)
print(output) 

我遇到了这样的错误

输出 = [Errno 2] 没有这样的文件或目录:“awk '{print $4}'”

我修复错误的地方只是在 sh 文件的末尾添加了一个管道。

外壳

#!/bin/bash
args=("$@")

snmpwalk -v 1 -c public ${args[0]} ${args[1]} | awk '{print $4}'

希望对大家有所帮助