如何从Python中执行shell命令获得输出
我正在尝试使用如何从Python中执行shell命令获得输出,python,python-2.7,subprocess,Python,Python 2.7,Subprocess,我正在尝试使用python 但问题是,即使存在错误或错误,它也不会给出输出: 这就是我尝试过的: get_ns_p1 = subprocess.Popen(['kubectl', 'get', 'ns'], stdout=subprocess.PIPE) get_ns_p2 = subprocess.Popen(["grep", "-E", "\'(^|\s)"+NAMESPACE+"($|\s)\'"], stdi
python
但问题是,即使存在错误或错误,它也不会给出输出:
这就是我尝试过的:
get_ns_p1 = subprocess.Popen(['kubectl', 'get', 'ns'], stdout=subprocess.PIPE)
get_ns_p2 = subprocess.Popen(["grep", "-E", "\'(^|\s)"+NAMESPACE+"($|\s)\'"], stdin=get_ns_p1.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
get_ns_p1.stdout.close() # Allow proc1 to receive a SIGPIPE if proc2 exits.
out_ns, err = get_ns_p2.communicate()
print("output: " + out_ns)
print("error: " + err)
输出如下所示:
输出:
错误:
但在终端itseld中,它显示如下输出:
服务器错误(AlreadyExists):名称空间“名称空间测试”已存在
如何将此错误添加到我的
err
变量中?您的代码工作正常;问题在于,如果kubectl
的写入完全正确,则试图捕获在stderr
上发出的字符串
但是,作为一个单独的子进程运行grep
,效率很低,而且没有必要;Python本身在中提供了一个功能更加完善的正则表达式引擎,它还可以避免启动单独进程的开销
重新导入
r=re.compile(r'(?:^ |\s){}(?:\s |$)'.format(名称空间))
kube=subprocess.run(['kubectl','get','ns',text=True,capture\u output=True)
e=[]
对于kube.stderr.split('\n')中的行:
如果r.search(错误):
e、 追加(行)
错误='\n'。加入(行)
如果您被限制在没有subprocess.run()
的较旧版本的Python中,那么您必须重新实现它
p = subprocess.Popen(['kubectl', 'get', 'ns'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out_ns, err = p.communicate()
e = []
for line in err.split('\n'):
...
这有许多缺陷和缺点;您真的应该认真考虑升级到Python 3.5+。在子进程中运行
grep
无论如何都是愚蠢的。只需在stdout
上从subprocess.run(['kubectl','get','ns',text=True,capture\u output=True)重新搜索(r'(?:^ |$){(?:){s}格式(名称空间))
就可以给我一个工作示例吗请告诉我我是python新手。我几乎做到了。您在使用哪些部件时遇到问题?另见。。。但是,如果您要查找的是错误消息,则应该检查stderr
。此处的re
是什么?另请参阅以获得更好的重新实现。