在Windows交互式命令行程序上使用subprocess.Popen
并设置stdout = PIPE
或stdout = 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_output
,getoutput
,但我想无论如何他们都使用相同的东西。
再次,我的问题是:如何捕获子流程的所有输出?
编辑1:我尝试逐行读取它,但它仍在同一位置剪切。我已经尝试过Powershell和Windows命令提示符。我在Linux Mint上使用Linux构建的Steamcmd尝试了同样的事情。在Linux上,我能够捕获子进程的所有输出并将其存储在文件中。因此,这似乎不是python问题,而是Windows或Windows cli问题,导致它无法捕获所有输出。我告诉它等待,将其发送到PIPE而不是文件,它将始终缩短。在生成我的文件之前,输出的最后一部分会丢失。