如何从在Python中执行shell命令获取输出

问题描述 投票:0回答:1

我正在尝试使用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变量出错?

python subprocess
1个回答
0
投票

您的代码正常工作;问题是,如果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 +。

© www.soinside.com 2019 - 2024. All rights reserved.