用Python中的管道执行Shell命令



我是python的新手,尝试了谷歌搜索,但没有帮助。
我需要在管道中调用此类命令(获取Mailq 的最古老的待处理邮件):

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

该命令在外壳中工作。

在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]

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

sort:写入失败:标准输出:损坏的管道 nsort:写入错误 n

想知道是什么引起了这种错误?

我认为这应该有效:

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

打印响应的第一行

而不是让壳牌照顾命令将您的命令分配到多个过程并输送它们,而是自己动手做。请参阅此处如何将一个子过程流送到另一个子过程。

这样,您可以查找每个步骤的输出(例如,通过将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]

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

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]

这是使用管道的Pythonic方法。

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)

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) 

我遇到这样的错误

output = [errno 2]没有这样的文件或目录:awk'{print $ 4}'

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

shell

#!/bin/bash
args=("$@")
snmpwalk -v 1 -c public ${args[0]} ${args[1]} | awk '{print $4}'

希望它能帮助某人

相关内容

  • 没有找到相关文章

最新更新