交互式子流程的标准输出已缩短

时间:2018-08-24 01:22:27

标签: python windows python-3.x subprocess

在Windows交互式命令行程序上使用subprocess.Popen并设置stdout = PIPEstdout = somefileobject时,输出将始终被剪切或截断,并且缺少提示和其他文字。

所以我的问题是:如何捕获子流程的所有输出?

以下更多详细信息:

我专门尝试从steamcmd获取输出。这是我在终端中的Python环境中运行的一些代码示例和输出。

from subprocess import Popen
#This command opens steamcmd, logs in, and calls licenses_print. It dumps 
#all licenses available to the user, and then quits the program.
cmd = (['path to steamcmd', 'arg1', 'arg2',...])
Popen(cmd)

在此,我没有将stdout设置为任何值,因此它将所有输出转储到终端中,并且我可以看到所有内容。大约70行文字。最后几行是我所期望的,这是我直接运行steamcmd所得到的。

License packageID 166844:
 - State   : Active( flags 0 ) - Purchased : Sat Jun  2 12:43:06 2018 in "US", Wallet
 - Apps    : 620980,  (1 in total)
 - Depots   : 620981,  (1 in total)

但是当我尝试将其传递到文件中时,如下所示

f = open('path to file', 'w+')
Popen(cmd, stdout = f).wait()
f.close()

转储到文件的输出被截断,最后几行看起来像这样

License packageID 100123:
 - State   : Active( flags 512 ) - Purchased : Sat Jun 10 19:34:14 2017 in "US", Complimentary
 - Apps    : 459860,  (1 in total)
 - Depots   : 4598

您可以看到它没有包装到166844中,它停在“-仓库:459861,(总共1个)”行的中间

我已经了解到PIPE具有大小限制并导致挂起,但从来没有挂过,输出几乎不够大,但是无论如何我一直尝试直接输出到文件,但没有用。我已经尝试过使用check_outputgetoutput,但我想无论如何他们都使用相同的东西。

再次,我的问题是:如何捕获子流程的所有输出?

编辑1:我尝试逐行读取它,但它仍在同一位置剪切。我已经尝试过Powershell和Windows命令提示符。我在Linux Mint上使用Linux构建的Steamcmd尝试了同样的事情。在Linux上,我能够捕获子进程的所有输出并将其存储在文件中。因此,这似乎不是python问题,而是Windows或Windows cli问题,导致它无法捕获所有输出。我告诉它等待,将其发送到PIPE而不是文件,它将始终缩短。在生成我的文件之前,输出的最后一部分会丢失。

0 个答案:

没有答案