2016-04-27 9 views
2

Jetzt habe ich einen Test file.dat, dass ich hedddump auf und legte die Ausgabe in eine hedddump.dat-Datei.Verwenden einer Variable in einem subprocess.Popen Befehl

subprocess.Popen(['hexdump file.dat > hexdump.dat' ], shell=True) 

Als Randbemerkung, ich habe Vorschläge gesehen shell=True nicht zu verwenden, aber ich erhalte im Wesentlichen den Fehler OSError: [Errno 2] No such file or directory.

Also, ich möchte in der Lage sein, eine Variable oder ein Array, Dateien, anstelle der hardcoded "file.dat" übergeben. "Dateien" könnten eine Benutzereingabe oder ein Array/eine Liste sein, die von einem vorherigen Unterprozessabschnitt erzeugt wurden.

Ich habe einen Benutzereingabe Fall versucht:

from subprocess import Popen, PIPE, STDOUT 
files = raw_input('File Name: ')                         
p = subprocess.Popen(['hexdump files > hexdump.dat' ], stdout=PIPE, stderr=STDOUT)           
out,err = p.communicate(input=files)   

Auch mit:

p = subprocess.Popen(['hexdump', inputs, ' > hexdump.dat' ], stdout=PIPE, stderr=STDOUT)           

Danke für die Hilfe, ich weiß, ich bin nicht in geeigneter Weise die Struktur hier benötigt das Verständnis so einige „handholdy "Antworten würden geschätzt werden.

+0

Was ist das Problem mit dem, was Sie versucht haben? – user312016

+0

Fehlerausgang: Traceback (jüngste Aufforderung zuletzt): File "scratchpadDecoder.py", Zeile 47, in subprocess.Popen ([ 'hexdump file.dat> hexdump.dat']) Datei „/ dsw/python -2.7.1/lib/python2.7/subprocess.py ", Zeile 672, in __init__ errread, errrite) Datei" /dsw/python-2.7.1/lib/python2.7/subprocess.py ", Zeile 1202, in _execute_child raise child_exception – stackofpancakes

Antwort

1

Sie shell=True müssen, weil sonst ist es mit diesem Namen für eine ausführbare Datei aussehen. shell=True teilt der Methode mit, die Shell zum Ausführen des Befehls zu verwenden, so dass > und Freunde zu dem werden, was sie ursprünglich sein sollten (Weiterleitung).

Der folgende Code Sie auf dem Laufenden:

from subprocess import Popen, PIPE, STDOUT 
files = raw_input('File Name: ')                         
p = subprocess.Popen(['hexdump files > hexdump.dat' ], stdout=PIPE, stderr=STDOUT)           
out,err = p.communicate(input=files) 

wird nicht funktionieren, weil Sie nur files zu hexdump vorbei, und wenn eine Datei mit dem Namen files existiert nicht erhalten Sie eine Fehlermeldung erhalten (und wenn es vorhanden ist, dann ist es wahrscheinlich immer noch nicht, was Sie wollten)

Was Sie wollen, ist die Zeichenfolge bauen Sie ausführen.

file = "input.dat" 
p = subprocess.Popen("hexdump " + file + " > hexdump.dat", shell=True) 
+0

Wow danke. Ich hatte gedacht, dass ich die "+" - Kombination in der Vergangenheit ausprobiert hatte, ohne zwischen Kommas zu unterscheiden, aber ich denke, das war für ein anderes Thema. Sehr erfreut. – stackofpancakes

+1

Ich möchte auch darauf hinweisen, dass, während ich Ihre Frage zu Variablen beantwortete, der Code, den ich gepostet habe, nicht wirklich idiomatisch ist. Die Antworten, die keine Shell = True verwenden und die vom Subprozessmodul bereitgestellte Umleitung verwenden, haben einen besseren Code. – itdoesntwork

-1

Als erstes, in Bezug auf Datei nicht gefunden, müssen Sie möglicherweise das aktuelle Arbeitsverzeichnis angeben.

subprocess.Popen(['hexdump file.dat > hexdump.dat' ], shell=True, cwd='/bar/foo') 

In Bezug in einem Array als Argument vorbei, das ist in der Regel so etwas wie:

args = [ 'hexdump', ] + inputs 
subprocess.Popen(args, cwd='/foo/bar') 
+0

Müsste ich nicht etwas haben wie: args = ['hexdump',] + inputs + [> hexdump.dat]? – stackofpancakes

1

Statt mit > die Umleitung Du mit dem stdout param umleiten. Wie für die Liste der Dateien, können Sie einfach die Liste der Dateien zu einem Array mit hexdump hängen, dh

myfiles = ['file1','file2'] 
with open('hexdump.dat', 'w') as output: 
    proc = subprocess.Popen(['hexdump'] + myfiles, stdout=output) 
+0

Der einzige Schluckauf mit diesem ist, dass ich denke, dass es alle hexdumps in eine hexdump.dat setzt und ich sie noch für die spätere Verwendung getrennt benötige. Aber ich werde darüber nachdenken, dies zu berücksichtigen, wenn ich das Array-Problem anspreche. – stackofpancakes

+0

Was ist das Array-Problem? Wenn Sie mehrere Dateien ausgeben möchten, müssen Sie eine Schleife oder etwas zu diesem Zweck verwenden – wonton

+0

Leider führt dies zu dem Fehler: TypeError: kann nur Liste (nicht "str") verketten, um – stackofpancakes

3

Warning: Passing shell=True can be a security hazard if combined with untrusted input. See the warning under Frequently Used Arguments for details.

Etwas wie:

with open('hexdump.dat', 'wb') as f: 
    p = subprocess.Popen(['hexdump', 'file.dat'], stdout=f) 
    p.wait() 

Sie auf Popen lesen sollte und was das shell Argument der Fall ist, und Ihre Entscheidung treffen.

+0

können Sie 'subprocess.check_call()' anstelle von 'Popen() verwenden. Wait()' hier – jfs

+0

Wahr, ich behielt nur das Thema. – totoro

0

Ich fand die einfachste Weg für mich Shell-Umleitung mit Python zu tun und ist Variablen wie folgt: Griff Es kann

subprocess.check_output('svnadmin load %s < %s' % (repo, fname), shell=True) 

sehr große Dateien.