解释bash在Python子过程模块中的输出

时间:2018-12-25 17:17:07

标签: python python-3.x bash subprocess

我一直在研究Doug Helmann的PYMOPTW上的const express = require('../../node_modules/express'); const app = express(); // default response app.use('/', (req, res, next) => { next(); try { res.send({ profile: { first_name: 'Aaron', last_name: 'Pol' } }); } catch (e) { // } }); // definite state, where default response can be changed app.use('/', (req, res) => { res.send({ profile: { first_name: 'John', last_name: 'Pol' } }); }); app.listen(9090); 模块示例。这是我遇到的麻烦的代码片段。

subprocess

我知道应该# subprocess_run_output_error.py import subprocess try: completed = subprocess.run( 'echo to stdout; echo to stderr 1>&2; exit 1', check=True, shell=True, stdout=subprocess.PIPE, ) except subprocess.CalledProcessError as err: print('ERROR:', err) else: print('returncode:', completed.returncode) print('Have {} bytes in stdout: {!r}'.format( len(completed.stdout), completed.stdout.decode('utf-8')) ) 引发错误,并运行except子句。

exit 1

我不明白为什么to stderr ERROR: Command 'echo to stdout; echo to stderr 1>&2; exit 1' returned non-zero exit status 1. 不是打印出来的,而是to stdoutto stderr运行后没有出现1>&2吗?

为了更好地理解,我更改了代码以查看是否可以运行echo to stdout部分,因此将其切换为else。当我这样做时,我得到的输出是:

exit 0

我似乎不了解to stderr returncode: 0 Have 10 bytes in stdout: 'to stdout\n' 的含义,尽管去了cheatsheets

  1. 再次打印1>2。为什么to stderr自出现以来就没有被首先打印出来?

  2. 为什么to stdout对象仅保留CompletedProcess 而不是to stderr

  3. 如果我理解下面的cheatsheet's部分,为什么to stdout的文件描述符为to stderr时不发送到标准错误流?
  

n>&m#使文件描述符n成为输出文件的副本   描述符

我发现与此相对较近的另一个问题是this。但是,它正在比较2&>。我无法理解最初的>&,因此感到更加困惑。

1 个答案:

答案 0 :(得分:1)

  1. 因为您捕获了它,所以可以在completed.stdout上找到它。
  2. 因为您只捕获了标准输出:stdout=subprocess.PIPE,但没有捕获stderr=subprocess.PIPE
  3. 它实际上已发送到stderr,这就是为什么要在开始打印它的原因,因为您没有捕获它并且该流没有缓冲。