2011-09-19 53 views
11

所以我想从os.popen搬往subprocess.popen所推荐的用户指南。我遇到的唯一困难是我似乎无法找到使readlines()工作的方法。Python子进程readlines()?

所以我曾经是能够做到

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

但我不能做

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

宁愿做'名单= subprocess.call([ 'ls' 的, ' - L'])readlines方法() ' – jdborg

+2

这是不对的 - 'call'只返回返回代码,而不是输出。 – agf

+0

http://stackoverflow.com/questions/2924310/whats-a-good-equivalent-to-pythons-subprocess-check-call-that-returns-the-conte – jfs

回答

23

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

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

然后,您总是可以将流程'stdout中的字符串与分开。

out = out.splitlines() 
+0

认为这是意味着是“漂亮的新途径“这样做。感谢您的回答,我会在超时时间到时将其设置。我迷惑不解。 – jdborg

+3

用'communicate'的问题是,你的所有输出的同时,以非递归'ls'的情况下是不太可能有问题。通过使用'stdout'成员,你可以逐行阅读(想想'find')。 –

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

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

for ln in ls.stdout: 
    # whatever 
+1

这种方法比公认的答案更可取,因为它允许在子过程产生输出时通读输出。 – Hoons

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

+0

这不是线条列表,它是单个多行字符串。 – agf

+0

好点,固定 – Kimvais

8

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

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

不错,我想这不是广为人知,因为它仅是Python的2.7+。 – agf

+0

@agf:按照链接,适用于较老的Python版本。 – jfs

+0

我知道,我已经遵循你发布的两个链接(和upvoted每个职位)。我很惊讶,我不知道这个便利功能,直到我看到它是2.7+。 – agf

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()