我是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}'
希望它能帮助某人