Python 从子流程检查输出解析表格输出
我正在从事一个Python(3.6)项目,在该项目中,我需要解析subprocess.check_输出的表格输出中的数据 下面是我如何使用它的: 输出为:Python 从子流程检查输出解析表格输出,python,subprocess,Python,Subprocess,我正在从事一个Python(3.6)项目,在该项目中,我需要解析subprocess.check_输出的表格输出中的数据 下面是我如何使用它的: 输出为: NAME HOSTS ADDRESS PORTS AGE mysvcs * 107.178.250.150 80 1m 这将为地址加载一个空列,如下所示: NAME HOSTS ADDRESS PORTS AG
NAME HOSTS ADDRESS PORTS AGE
mysvcs * 107.178.250.150 80 1m
这将为地址加载一个空列,如下所示:
NAME HOSTS ADDRESS PORTS AGE
mysvcs * 80 1m
但几分钟后,它加载第二行第3列中的107.178.250.150
。
那么,当这个地址被填充后,我如何才能得到它呢。
以下是我的尝试:
address = subprocess.check_output(["kubectl get ing | awk '{print $3}'"], shell=True)
all_address = out_ip.decode().split('\n')
print(all_address)
address = all_address[1]
print(address)
if not address:
while address == '':
out_address = subprocess.check_output(["kubectl get ing | awk '{print $3}'"], shell=True)
all_address = out_ip.decode().split('\n')
ip = all_address[1]
print(address)
但它甚至没有运行while循环和输出:
b'地址\n80\n'
['地址','80','']
80
更新:以下是我如何尝试stovfl的答案:
问题:解析表格输出,循环直到结果为IP地址
使用Python:3.4.2测试如果您使用的是Python 3.5或更高版本,您可以升级到具有一些有用功能的subprocess.run()
我还将考虑外壳和Awk管道
addr = None
while True:
result = subprocess.run(
['kubectl', 'get', 'ing'],
stdout=subprocess,PIPE, stderr=subprocess.PIPE,
text=True, check=True)
lines = result.stdout.split('\n')
# [1:] - skip header line
# [:-1] - skip empty element after last newline
for line in lines[1:-1]:
# replace Awk
filelds = line.split()
if len(fields) > 2 and '.' in fields[2]:
addr = fields[2]
break
if addr:
break
time.sleep(1)
text=True
负责使用标准换行符将输出自动规范化为Unicode。(在Python 3.7之前,这是universal\u newlines=True
)这是Python(3.6)的一个有效解决方案:
您的问题并显示print(address)
Hi@stovfl的输出,它的输出是80
在while循环之外。我想在子流程之后看到它。检查输出(…
Hi@stovfl,如果地址已经创建,那么它的输出是:address\n35.241.40.83\n
,但是如果它没有创建,那么输出是address\n80\n
所以你只想循环直到你得到一个IP地址?Hi@stovfl,它不工作,它仍然没有打印匹配项
。现在它的输出是:l列表:['ADDRESS','80','list:['ADDRESS','80','list:['ADDRESS','80','list:['ADDRESS','80','list:['ADDRESS','80','''.''.[/code>@AbdulRehman:你没有IP地址,将延迟提高到时间。睡眠(3)
。你怎么能安全kubectl
将返回IP地址?嗨@tripleee,TypeError:\uuuu init()获取了一个意外的关键字参数“text”@AbdulRehmantext
在3.7中被重命名;旧的、有点误导性的名称是universal\u newlines
。有关详细信息,请再次查看链接答案。
import time, re
# Limit to 5 loops
for n in range(5):
result = subprocess.check_output(["kubectl get ing | awk '{print $3}'"], shell=True)
# Make a List from the result, spliting at NewLine
_list = result.decode().split('\n')
# DEBUG
print("list:{}".format(_list))
# Check if Value 2 (Index==1) matches a IP Address
if re.match(r'(\d+\.\d+\.\d+\.\d+)', _list[1]):
print("match:{}".format(_list[1]))
# End the loop
break
# Wait a second, before next try
time.sleep(1)
addr = None
while True:
result = subprocess.run(
['kubectl', 'get', 'ing'],
stdout=subprocess,PIPE, stderr=subprocess.PIPE,
text=True, check=True)
lines = result.stdout.split('\n')
# [1:] - skip header line
# [:-1] - skip empty element after last newline
for line in lines[1:-1]:
# replace Awk
filelds = line.split()
if len(fields) > 2 and '.' in fields[2]:
addr = fields[2]
break
if addr:
break
time.sleep(1)
addr = None
while addr is None:
out = subprocess.check_output(["kubectl get ing | awk '{print $3}'"], shell=True)
print(out)
all_addr = out.decode().split('\n')
if re.match(r"\d+\.\d+\.\d+\.\d+", str(all_addr[1])):
addr = all_addr[1]
print('Address is: {}'.format(addr))
else:
addr = None