2010-03-27 5 views
0

J'ai lu la documentation et j'ai essayé beaucoup de choses dans le REPL, et googled, mais je ne peux pas pour la vie de moi comprendre comment subprocess .Popen fonctionne en Python.Comment traduire les appels IO.popen de Ruby dans les appels subprocess.Popen de Python?

Voici un code Ruby J'utilise:

IO.popen("some-process") do |io| 
    while(line = io.gets) 
    # do whatever with line 
    end 
end 

Comment puis-je traduis cela en Python en utilisant subprocess.Popen?

+1

Il existe de nombreux exemples utiles de la façon d'utiliser ici 'subprocess': http://blog.doughellmann.com /2007/07/pymotw-subprocess.html – unutbu

Répondre

2

Probablement la plus simple "proche" de votre code Ruby en Python:

>>> import subprocess 
>>> io = subprocess.Popen('ls', stdout=subprocess.PIPE).stdout 
>>> for line in io: print(line.strip()) 
+0

Notez que la lecture d'un 'stdout' de' Popen' comporte un certain risque d'interblocages. Il est généralement préférable d'utiliser 'communiquer' si le blocage est acceptable. –

+0

@Mike, si le sous-processus ferme juste sa première chose stdin (comme 'ls' - comme' some-process' ferait mieux de faire dans le code Ruby puisque c'est ** jamais ** donné ** aucune ** entrée!) aucun blocage n'est possible dans les systèmes d'exploitation que je connais. Seuls les sous-processus qui ** utilisent ** leur stdin sont à n'importe quel risque imaginable - ainsi votre "généralement" est totalement inapplicable à la fois à ce Q et à mon A. –

0
import subprocess 

process = subprocess.Popen(['ls',], stdout=subprocess.PIPE) 
print process.communicate()[0]