Python子进程readlines()?

时间:2011-09-19 09:12:57

标签: python subprocess

所以我试图按照用户指南的建议从os.popen转移到subprocess.popen。我遇到的唯一麻烦是我似乎找不到让readlines()工作的方法。

所以我以前能够做到

list = os.popen('ls -l').readlines()

但我做不到

list = subprocess.Popen(['ls','-l']).readlines()

5 个答案:

答案 0 :(得分:31)

ls = subprocess.Popen(['ls','-l'], stdout=subprocess.PIPE)
out = ls.stdout.readlines()

或者,如果你想逐行阅读(也许其他过程比ls更密集):

for ln in ls.stdout:
    # whatever

答案 1 :(得分:25)

使用subprocess.Popen,使用communicate来读取和写入数据:

out, err = subprocess.Popen(['ls','-l'], stdout=subprocess.PIPE).communicate() 

然后,您始终可以使用stdout将流程“splitlines()”中的字符串拆分。

out = out.splitlines()

答案 2 :(得分:10)

Making a system call that returns the stdout output as a string

lines = subprocess.check_output(['ls', '-l']).splitlines()

答案 3 :(得分:3)

list = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE).communicate()[0].splitlines()

直接来自help(subprocess)

答案 4 :(得分:3)

使用子进程的更详细方法。

        # Set the command
        command = "ls -l"

        # Setup the module object
        proc = subprocess.Popen(command,
                            shell=True,   
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE)

        # Communicate the command   
        stdout_value,stderr_value = proc.communicate()

        # Once you have a valid response, split the return output    
        if stdout_value:
            stdout_value = stdout_value.split()