Python子进程将输出返回到列表中

时间:2018-03-06 14:05:52

标签: python

我正在尝试使用以下命令返回的每个IP地址创建一个列表。我不完全确定如何实现这一目标。似乎子进程等于无。

    import subprocess


    ips = list()
    def bash_command(cmd):
        subprocess.Popen(['/bin/bash', '-c', cmd])

    ips = bash_command("netstat -tuna tcp | grep 9876 | grep -v 0.0.0.0 | awk '{ print $5}' | cut -d':' -f1")

    print(ips)

2 个答案:

答案 0 :(得分:3)

为了读取输出,您需要将子进程的stdout定向到管道。之后,您可以使用readlines函数逐行读取输出(或readline一次读取一行),或使用read函数读取整个输出作为单字节数组。

def bash_command(cmd):
    sp = subprocess.Popen(['/bin/bash', '-c', cmd], stdout=subprocess.PIPE)
    return sp.stdout.readlines()

答案 1 :(得分:0)

由于问题标题很宽泛,因此这里是使用subprocess.run()的更通用的版本,它需要不同的args返回字符串。我们可以在字符串上调用splitlines()以返回列表

def subprocess_to_list(cmd: str):
    '''
    Return the output of a process to a list of strings. 
    '''
    return subprocess.run(cmd,text=True,stdout=subprocess.PIPE).stdout.splitlines()

使用ps

的基本示例
# run command
thelist = subprocess_to_list('ps')

# print the output when it completes
print(*thelist[:5],sep = "\n")

上面的示例输出:

    PID TTY          TIME CMD
   1070 ?        00:00:00 bash
   1071 ?        00:00:00 python3
   1078 ?        00:00:00 sh
   1081 ?        00:00:00 ps