Teilprozess.check_output(): OSError Datei nicht gefunden in Python
Ausführen folgenden Befehl und seinen Varianten immer zu einem Fehler führt, der ich einfach nicht herausfinden:
command = "/bin/dd if=/dev/sda8 count=100 skip=$(expr 19868431049 /512)"
print subprocess.check_output([command])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 566, in check_output
process = Popen(stdout=PIPE, *popenargs, **kwargs)
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Welche Datei es sich bezieht ? andere Befehle wie ls,wc ordnungsgemäß ausgeführt werden, obwohl der Befehl auch ausgeführt wird, sowie auf terminal aber nicht python-Skript.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre
command
ist eine Liste mit einem element. Stell dir vor, wenn Sie versucht haben, führen Sie diese in der shell:Das ist effektiv das, was du tust. Es ist fast sicher kein Verzeichnis mit dem Namen
dd if=
in Ihrembin
Verzeichnis, und es gibt noch mehr, ja fast schon gar nichtdev
Verzeichnis unter, mit einemsd8 count=100 skip=$(expr 19868431049
Verzeichnis mit einem Programm namens512
im es.Was Sie wollen, ist eine Liste, wo jedes argument ist sein eigenes element:
Aber das bringt uns zu dem zweiten problem:
$(expr 19868431049 /512)
wird nicht geparst werden von Python oder vondd
; das ist bash-syntax. Sie können, natürlich, nur tun die gleiche Sache in Python statt in der bash:Oder, wenn Sie wirklich wollen, um mit bash für keinen guten Grund, eine Zeichenfolge übergeben, sondern als eine Liste, und verwenden Sie
shell=True
:Obwohl das immer noch nicht zur Arbeit zu gehen, portabel, da die Standard-shell ist
/bin/sh
, die nicht wissen, wie zu behandeln bashisms wie$(…)
(undexpr
, obwohl ich denke, POSIX erfordert, dassexpr
gibt es als separaten Prozess...). Also:Dieser arbeitete für mich mit
subprocess.popen