使用 Python 中的管道执行 shell 命令
Execute shell command with pipes in Python
我是 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]
但我得到这样的输出:
sort: write failed: standard output: Broken pipe\nsort: write error\n
想知道是什么导致了这样的错误?
与其让 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]
我建议您使用此处所写的子流程:http://kendriu.com/how-to-use-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 方式。
我认为这应该可行:
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
打印响应的第一行
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}'"],input=shell.stdout,capture_output=True)
print(output)
我遇到了这样的错误
输出 = [Errno 2] 没有这样的文件或目录:“awk '{print $4}'”
我修复错误的地方只是在sh文件的末尾添加了一个管道。
Shell
#!/bin/bash
args=("$@")
snmpwalk -v 1 -c public ${args[0]} ${args[1]} | awk '{print }'
希望对大家有所帮助
我是 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]
但我得到这样的输出:
sort: write failed: standard output: Broken pipe\nsort: write error\n
想知道是什么导致了这样的错误?
与其让 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]
我建议您使用此处所写的子流程:http://kendriu.com/how-to-use-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 方式。
我认为这应该可行:
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
打印响应的第一行
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}'"],input=shell.stdout,capture_output=True)
print(output)
我遇到了这样的错误
输出 = [Errno 2] 没有这样的文件或目录:“awk '{print $4}'”
我修复错误的地方只是在sh文件的末尾添加了一个管道。
Shell
#!/bin/bash
args=("$@")
snmpwalk -v 1 -c public ${args[0]} ${args[1]} | awk '{print }'
希望对大家有所帮助