Python:subprocess.Popen将输出存储在列表列表中

时间:2019-06-19 10:44:07

标签: python subprocess

我在Python脚本中运行的Shell脚本中运行sql查询。因为,在prod env中我没有cx_Oracle库,所以我需要使用shell脚本。现在,当我使用python调用shell脚本时,我得到的输出是字符串。如何将输出转换为列表。您只能使用commands.getoutput或subprocess.Popen。

#!/usr/bin/python
import re,os,commands,os.path
import subprocess

#output = commands.getoutput("sh FA_FMW.sh")
output = subprocess.Popen(["sh", "ABC.sh"],
                          stdout=subprocess.PIPE).communicate()[0]
print output

输出:

Successfully created: APPABC.env
ABCenv succeeded.

ABC_ACTIVITIES              ACTIVITIES
12.11.1.8.0                     VALID       N

ABC_BIA_CLOUD               ATBCITE
12.11.1.8.1                     VALID       Y

上面我刚刚提到了两行查询输出,每行有5列。我如何才能明智地访问此输出行和列,以便对版本号和有效的无效标志执行某些操作。另外,需要过滤成功消息的前两行。例如,我只需要打印每行的前两列。这两条线是同一行的一部分。

for i in range(0, len(output)):
        print output[i][0], output[i][2], output[i][4]

输出:

ABC_ACTIVITIES 12.11.1.8.0 N
ABC_ACTIVITIES 12.11.1.8.1 Y

1 个答案:

答案 0 :(得分:1)

使用正则表达式。

例如:

import re
output = """Successfully created: APPABC.env
ABCenv succeeded.

ABC_ACTIVITIES              ACTIVITIES
12.11.1.8.0                     VALID       N

ABC_BIA_CLOUD               ATBCITE
12.11.1.8.1                     VALID       Y"""

for chunk in re.findall(r"\n\b[A-Z_]+\b.*?\b[A-Z]\b", output, flags=re.MULTILINE|re.DOTALL):
    print chunk.split()[0::2]

输出:

['ABC_ACTIVITIES', '12.11.1.8.0', 'N']
['ABC_BIA_CLOUD', '12.11.1.8.1', 'Y']