python - 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
解决方案
使用正则表达式。
前任:
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']
推荐阅读
- angular - RxJs 动态 debounceTime 不是动态的
- javascript - 为什么 CSS 动画突然结束?
- reactjs - 如何将数据库中的数据插入到 MDB 表中?
- npm - signalr.js 如何从我的项目中找到其相关的依赖项?
- dictionary - 如何用地图替换多个“if-else-if”
- mysql - 将此 MySQL GROUP_CONCAT 迁移到 PostgreSQL STRING_AGG
- java - 如何将数据从 sqlite 加载到 recyclierview?
- python - 如何使用两个不同的 .format() 并使用一个 for 循环
- database - 具有雄辩关系的此集合实例错误中不存在属性 [标题]
- reactjs - 从 API 接收位置数据后加载反应谷歌地图组件