2010-10-08 3 views
5

J'ai essayé d'exécuter ce code à partir du livre 'Python Standard Library' de 'Fred Lunde'.remplacement de sous-processus de popen2 avec Python

import popen2, string 

fin, fout = popen2.popen2("sort") 

fout.write("foo\n") 
fout.write("bar\n") 
fout.close() 

print fin.readline(), 
print fin.readline(), 
fin.close() 

Il fonctionne bien avec un avertissement de

 
~/python_standard_library_oreilly_lunde/scripts/popen2-example-1.py:1: 
DeprecationWarning: The popen2 module is deprecated. Use the subprocess module. 

Comment traduire la fonction précédente avec sous-processus? J'ai essayé comme suit, mais ça ne marche pas.

from subprocess import * 

p = Popen("sort", shell=True, stdin=PIPE, stdout=PIPE, close_fds=True) 
p.stdin("foo\n")    #p.stdin("bar\n") 
+0

* quelques erreurs *? – SilentGhost

Répondre

9
import subprocess 
proc=subprocess.Popen(['sort'],stdin=subprocess.PIPE,stdout=subprocess.PIPE) 
proc.stdin.write('foo\n') 
proc.stdin.write('bar\n') 
out,err=proc.communicate() 
print(out) 
0

Dans le module multiprocessing il y a une méthode appelée « piscine » qui pourrait être parfait pour vos besoins étant donné que vous envisagez de faire genre (ne sais pas si énorme que les données sont, mais ...) .

Il optimise lui-même le nombre de cœurs de votre système. c'est-à-dire que autant de processus sont engendrés que le non. des noyaux. Bien sûr, ceci est personnalisable.

from multiprocessing import Pool 

def main(): 
    po = Pool() 
    po.apply_async(sort_fn, (any_args,), callback=save_data) 
    po.close() 
    po.join() 
    return 

def sort_fn(any_args): 
    #do whatever it is that you want to do in a separate process. 
    return data 

def save_data(data): 
    #data is a object. Store it in a file, mysql or... 
    return 
Questions connexes