2010-09-06 7 views
3

J'ai le code suivant:Envoi gros fichier à l'entrée PIPE en python

sourcefile = open(filein, "r") 
targetfile = open(pathout, "w") 

content= sourcefile.read(): 

p = Popen([SCRIPT], stdout=targetfile, stdin=PIPE) 
p.communicate(content) 

sourcefile.close() 
targetfile.close() 

Les données en sourcefile est assez grand, donc il faut beaucoup de mémoire/swap pour le stocker dans le « contenu ». J'ai essayé d'envoyer le fichier directement à stdin avec stdin = sourcefile, qui fonctionne à l'exception du script externe 'se bloque', c'est à dire: continue à attendre un EOF. Cela peut être un bug dans le script externe, mais c'est hors de mon contrôle pour l'instant ..

Un conseil sur la façon d'envoyer le fichier volumineux à mon script externe?

+0

Il est très étrange que le script externe se bloque si vous fournissez directement le descripteur de fichier. Est-ce qu'il se bloque également lorsque vous l'exécutez depuis le terminal: 'script < infile > outfile'? – rkhayrov

Répondre

4

Remplacez le p.communicate(content) par une boucle qui lit à partir du sourcefile et écrit p.stdin dans les blocs. Lorsque sourcefile est EOF, veillez à fermer p.stdin.

sourcefile = open(filein, "r") 
targetfile = open(pathout, "w") 

p = Popen([SCRIPT], stdout=targetfile, stdin=PIPE) 
while True: 
    data = sourcefile.read(1024) 
    if len(data) == 0: 
     break 
    p.stdin.write(data) 
sourcefile.close() 
p.stdin.close() 

p.wait() 
targetfile.close() 
+0

Ça a bien fonctionné, merci! – Oli

Questions connexes