Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从子流程检查输出解析表格输出_Python_Subprocess - Fatal编程技术网

Python 从子流程检查输出解析表格输出

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

我正在从事一个Python(3.6)项目,在该项目中,我需要解析subprocess.check_输出的表格输出中的数据

下面是我如何使用它的: 输出为:

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”@AbdulRehman
text
在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