首页 > 解决方案 > Python如何捕获命令行调用的所有输出

问题描述

我正在尝试从 python 脚本检查系统是否安装了 anaconda。

我对如何做到这一点的想法是从 python 脚本中调用“which conda”并获取输出。

尽管出于某种原因,这似乎是不可能的。在我的电脑(运行 High Sierra 的 2015 Macbook Pro)上,调用它似乎会引发某种错误。这没有问题,除了 python 似乎在任何情况下都无法捕获调用的错误输出。

我尝试过 subprocess.call、os.system、subprocess.run、subprocess.check_call、subprocess.check_output。

在所有这些情况下,尽管声称您可以使用 stderr=subprocess.PIPE 或 stderr=subprocess.STDOUT 将错误输出转发到标准输出,但我已经能够从任何这些调用中获得所有信息。

我可以在命令行上看到,当我调用“which conda”时,它会输出大量文本。

在 python 中,即使我按照指示捕获错误,输出也是一个空白字符串。

这令人难以置信的沮丧,因为这似乎是一件难以置信的简单事情;我现在花了很多时间。它可以在命令行上完成。为什么不能用这种高级语言来完成?

任何帮助/提示表示赞赏。谢谢!

标签: pythoncommand-linesubprocess

解决方案


我没有anaconda ...我只是用python替换:

>>> from os import popen
>>> cmd = "which python"
>>> for i in popen(cmd):
...     print(i)
... 
/usr/bin/python

您还可以执行以下操作来获取路径的最后一部分:

from os import path, popen
cmd = "which python"
>>> for i in popen(cmd):
...     print(path.basename(i))
... 
python

这个也对我有用:

>>> for i in popen('whereis python'):
...     for j in i.split():
...         print(j)
... 
python:
/usr/bin/python2.7-config
/usr/bin/python3.5
/usr/bin/python3.5m
/usr/bin/python
/usr/bin/python2.7
/usr/bin/python3.5m-config
/usr/bin/python3.5-config
/usr/lib/python3.5
/usr/lib/python2.7
/etc/python3.5
/etc/python
/etc/python2.7
/usr/local/lib/python3.5
/usr/local/lib/python2.7
/usr/include/python3.5
/usr/include/python3.5m
/usr/include/python2.7
/usr/share/python
/usr/share/man/man1/python.1.gz

推荐阅读