Python子进程/ Popen stdout被截断

时间:2014-12-06 04:51:48

标签: python pipe subprocess popen

Popen标准输出的输出与从Shell运行命令或使用os.system的输出不同:

cmd = ['git', 'diff', commitHash, '--stat']

print Popen(cmd, stdout=PIPE).stdout.read().strip()
os.system(' '.join(cmd))

Popen的输出:

 src/tech/dalvik/sidebar.md                         |   10 -
 .../encryption/android_crypto_implementation.md    |  359 --
 src/tech/encryption/index.md                       |   22 -
 src/tech/encryption/sidebar.md                     |    9 -
 src/tech/index.md                                  |   58 -
 src/tech/nfc/index.md                              |   25 -
 src/tech/nfc/sidebar.md                            |    7 -
 src/tech/sidebar.md                                |    5 -
 templates/footer                                   |    3 +-
 templates/includes                                 |    2 +-
 templates/sidebar                                  |    2 +-
 257 files changed, 32311 insertions(+), 11358 deletions(-)

os.system的输出(与从Shell运行相同)

 src/tech/dalvik/sidebar.md                                         |   10 -
 src/tech/encryption/android_crypto_implementation.md               |  359 ---------
 src/tech/encryption/index.md                                       |   22 -
 src/tech/encryption/sidebar.md                                     |    9 -
 src/tech/index.md                                                  |   58 --
 src/tech/nfc/index.md                                              |   25 -
 src/tech/nfc/sidebar.md                                            |    7 -
 src/tech/sidebar.md                                                |    5 -
 templates/footer                                                   |    3 +-
 templates/includes                                                 |    2 +-
 templates/sidebar                                                  |    2 +-
 257 files changed, 32311 insertions(+), 11358 deletions(-)

我如何让subprocess.Popenos.system一样工作?

我在此处找到了类似的问题:Stdout captured from pipe in Python is truncated,但设置LANG环境变量似乎无效。

谢谢!

1 个答案:

答案 0 :(得分:1)

我不认为输出实际上是被截断的。

可能git会给你不同的输出,试图最好地向你展示差异统计数据。

从您的示例中,我猜这个问题是envvar COLUMNS的不同值。

检查您的终端有多少列:

$ echo $COLUMNS

并在Popen调用中设置此envvar:

Popen(cmd, stdout=PIPE, env={'COLUMNS':'249'})