Python 从终端捕获结果(外部进程)

Python 从终端捕获结果(外部进程),python,linux,python-2.7,terminal,Python,Linux,Python 2.7,Terminal,我需要从终点站得到结果 mask = "audio" a = os.system("ls -l | grep %s | awk '{ print $9 }'" % mask) print a # a = 0, that's the exit code #=> file1_audio file2_audio 0 这个命令只是将结果打印到控制台,而我想将其捕获到一个变量中 使用该模块 由于管道是由shell运行的,因此需要shell=True,否则您将得到一个没有此类文件或目录的 在Pyt

我需要从终点站得到结果

mask = "audio"
a = os.system("ls -l | grep %s | awk '{ print $9 }'" % mask)
print a # a = 0, that's the exit code

#=>
file1_audio
file2_audio
0
这个命令只是将结果打印到控制台,而我想将其捕获到一个变量中

使用该模块

由于管道是由shell运行的,因此需要
shell=True
,否则您将得到一个
没有此类文件或目录的

在Python2.7中,还可以使用

output = subprocess.check_output(
    "ls -l | grep %s | awk '{ print $9 }'" % mask
    stderr=subprocess.STDOUT,
    shell=True)
但是我发现使用它很麻烦,因为它抛出了一个子进程。如果管道返回的出口代码不是0,那么调用的进程错误
,并且要捕获stdout和stderr,您需要将它们都交错,这使得它在许多情况下不可用。

使用该模块

由于管道是由shell运行的,因此需要
shell=True
,否则您将得到一个
没有此类文件或目录的

在Python2.7中,还可以使用

output = subprocess.check_output(
    "ls -l | grep %s | awk '{ print $9 }'" % mask
    stderr=subprocess.STDOUT,
    shell=True)

但是我发现使用起来很麻烦,因为它抛出了一个子进程。如果管道返回的出口代码不是0,那么调用的进程错误
,并且要捕获stdout和stderr,您需要将它们都交错,这使得它在许多情况下无法使用。

您在这里尝试的操作也可以在纯Python中完成。@Keith,这只是一个例子,我有一个更严肃的任务。然后你可以使用模块运行管道并阅读标准输出。请阅读常见问题解答。如果可能的话,你应该有这个问题。此外,这是一个常见的问题,对此已经有很多答案。请注意,如果您只是浏览一下,他们会建议您使用
子流程
,并将您直接链接到。我不知道你为什么希望我们能够比文档更好地解释它。你在这里尝试的也可以用纯Python来完成。@Keith,这只是一个例子,我有一个更严肃的任务。然后你可以使用模块运行管道并阅读标准输出。请阅读常见问题解答。如果可能的话,你应该有这个问题。此外,这是一个常见的问题,对此已经有很多答案。请注意,如果您只是浏览一下,他们会建议您使用
子流程
,并将您直接链接到。我不知道你为什么希望我们能够比文档更好地解释它。有没有办法以数组或列表而不是字符串的形式获得结果?你有一个字符串,这还不够好吗?stdout,stderr是字节流,而不是列表。如果你需要一个列表,比如stdout.splitlines(),他只需要在这里检查输出;没有理由创建一个
Popen
并调用
communicate
,除非你也有输入发送它(或者需要在创建和通信之间做其他事情等等)。啊,如果他有2.7。我总是忘记,因为我觉得使用起来很麻烦,所以会在非零出口上抛出异常,等等。有没有办法将结果作为数组或列表而不是字符串来获得?你有一个字符串,这还不够好吗?stdout,stderr是字节流,而不是列表。如果你需要一个列表,比如stdout.splitlines(),他只需要在这里检查输出;没有理由创建一个
Popen
并调用
communicate
,除非你也有输入发送它(或者需要在创建和通信之间做其他事情等等)。啊,如果他有2.7。我总是忘记,因为我发现使用起来很麻烦,所以在非零出口上抛出异常等等。