我正在尝试使用python
执行此Shell命令
但是问题是,即使有错也不会提供输出:
这是我尝试过的:
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)
输出看起来像:
输出:
错误:
但是在终端字段中,它显示了这样的输出:
来自服务器的错误(已存在):名称空间“ namespace-tests”已存在
我如何对我的err
变量出错?
您的代码正常工作;问题是,如果stderr
完全正确写入,则您试图捕获在kubectl
上发出的字符串。
但是,将grep
作为单独的子进程运行,效率很低,而且也没有必要; Python本身在re
library中具有功能更强大且更完整的正则表达式引擎,它还使您避免了启动单独进程的开销。
re
如果您被限制在没有import re
r = re.compile(r'(?:^|\s){}(?:\s|$)'.format(NAMESPACE))
kube = subprocess.run(['kubectl', 'get', 'ns'], text=True, capture_output=True)
e = []
for line in kube.stderr.split('\n'):
if r.search(err):
e.append(line)
err = '\n'.join(line)
的旧版Python中,则必须重新实现它,效果很差。
subprocess.run()
这具有许多缺陷和缺点;您确实应该认真考虑升级到Python 3.5 +。