如何将子流程输出保存为字符串列表以进行进一步分析?

时间:2019-03-03 00:14:17

标签: python python-3.x

我有此代码:

import os
import shlex, subprocess

cmd = "/usr/local/bin/gmx grompp -h"
args = shlex.split(cmd)
proc1 = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = proc1.stdout.read()
print(output)

基本上,我正在使用一个名为gromacs的程序。如您所见,我将stdoutstderr结合在一起,这样我就可以使用stdout.read()并获得所有内容。

但是,print(output)很烂,没有格式:

b' :-) GROMACS - gmx grompp, 2018.3 (-:\n\n GROMACS is written by:\n Emile Apol Rossen Apostolov Paul Bauer Herman J.C. Berendsen\n Par Bjelkmar Aldert van Buuren Rudi van Drunen Anton Feenstra \n Gerrit Groenhof Aleksei Iupinov Christoph Junghans Anca Hamuraru \n Vincent Hindriksen Dimitrios Karkoulis Peter Kasson Jiri Kraus \n Carsten Kutzner Per Larsson Justin A. Lemkul Viveca Lindahl \n Magnus Lundborg Pieter Meulenhoff Erik Marklund Teemu Murtola \n Szilard Pall Sander Pronk Roland Schulz Alexey Shvetsov \n Michael Shirts Alfons Sijbers Peter Tieleman Teemu Virolainen \n Christian Wennberg Maarten Wolf \n and the project leaders:\n Mark Abraham, Berk Hess, Erik Lindahl, and David van der Spoel\n\nCopyright (c) 1991-2000,

所有\n都应该有一个新行。

要拥有一个字符串列表,基本上每个字符串都是输出的一行,我该怎么做?

换句话说:

output = [" :-) GROMACS - gmx grompp, 2018.3 (-:", "GROMACS is written by:", ..........]

因此,我可以将它们作为output [i] .find(“ 2018”)和其他事物来处理。

我放的时候:

print(type(output))

我得到:

<class 'bytes'>

很明显,我必须做些其他事情才能得到需要的东西,但我不知道该怎么做。我希望我已经说清楚了。

1 个答案:

答案 0 :(得分:3)

我认为您可以通过在打印输出之前添加以下行来完成所需的操作:

output = output.decode().splitlines()

调用decode()会将bytes转换为python字符串(str),而splitlines()则将其转换为字符串列表。

decode()bytes方法,假设它们已被utf-8编码(默认情况下),则将它们解码为字符串-在subprocessing文档中没有记录知道的。)