0

Wie Subprozess verwenden, wenn meine Temp-Datei-Argument in der Mitte des Befehls ist? Zum Beispiel sieht ein Terminal-Befehl wie folgt aus:Python: übergeben, um eine temporäre generierte Datei nicht als das letzte Argument zu verarbeiten

program subprogram -a -b tmpFILE otherFILE 

I Variationen dieses versucht:

from subprocess import Popen, PIPE 
from tempfile import SpooledTemporaryFile as tempfile 
tmpFILE=tempfile() 
tmpFILE.write(someList) 
tmpFILE.seek(0) 
print Popen(['program','subprogram', '-a', '-b', otherFile],stdout=PIPE,stdin=tmpFILE).stdout.read() 
f.close() 

oder

print Popen(['program','subprogram', '-a', '-b', tmpFILE, otherFile],stdout=PIPE,stdin=tmpFILE).stdout.read() 

aber nichts funktioniert ... Meine temporäre generierte Datei in Python shouldn Sei nicht der letzte Parameter.

Dank

+0

Versuchen Sie, 'tmpFILE.name' zu ​​übergeben. –

Antwort

1

Gibt es einen Grund SpooledTemporaryFile anstelle von anderen Arten von temporärer Datei zu benutzen? Wenn nicht, empfehle ich die Verwendung von NamedTemporaryFile, da Sie den Namen davon abrufen können. Ich habe versucht, den Namen von SpooledTemporaryFile abzurufen und bekam '<fdopen>', die nicht gültig zu sein scheint.

Hier ist der vorgeschlagene Code ist:

from subprocess import Popen, PIPE 
import tempfile 

with tempfile.NamedTemporaryFile() as temp_file: 
    temp_file.write(someList) 
    temp_file.flush() 
    process = Popen(['program', 'subprogram', '-a', '-b', temp_file.name, otherFile], stdout=PIPE, stderr=PIPE) 
    stdout, stderr = process.communicate() 

Diskussion

  • die Verwendung mit Aussage, Sie müssen nicht über Schließen der Datei kümmern. Sobald der with-Block beendet ist, wird die Datei automatisch geschlossen.
  • Anstatt seek aufzurufen, sollten Sie flush aufrufen, um den Dateipuffer auf die Festplatte zu übertragen, bevor Sie program aufrufen.
+0

Sowohl '.seek (0)' als auch '.flush()' sollten die Daten an OS weitergeben (damit 'program' es zurücklesen kann). Als Alternative könnte eine [named pipe oder '/ dev/fd/#' Dateinamen verwendet werden (http://stackoverflow.com/a/28840955/4279) (um zu vermeiden, alle auf einmal zu schreiben oder zu vermeiden, die Daten zu schreiben Scheibe). – jfs