首页 > 解决方案 > Python:subprocess.Popen 将输出存储在列表列表中

问题描述

我在 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

标签: pythonsubprocess

解决方案


使用正则表达式。

前任:

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']

推荐阅读