Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Python中执行shell命令获得输出_Python_Python 2.7_Subprocess - Fatal编程技术网

如何从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
是什么?另请参阅以获得更好的重新实现。