2017-02-21 7 views
0

Vorwort: Ich verstehe, dass diese Frage schon einmal gestellt wurde, aber ich kann keine Lösung für meinen Fehler finden, indem ich diese vorherigen Antworten ansehe.Keine solche Datei oder Verzeichnis beim Versuch, Unterprozessaufruf auszuführen

Alles, was ich tun möchte, ist diff für die Ausgabe von zwei verschiedenen Befehlen auf der gleichen Datei aufrufen.

import os, sys 
from subprocess import check_call 
import shlex 

ourCompiler = 'espressoc'; 
checkCompiler = 'espressocr'; 

indir = 'Tests/Espresso/GoodTests'; 

check_call(["pwd"]); 

for root, dirs, filenames in os.walk(indir): 
    for f in filenames: 
     if len(sys.argv) == 2 and sys.argv[1] == f: 
      str1 = "<(./%s ./%s) " % (ourCompiler, os.path.join(root, f)) 
      str2 = "<(./%s ./%s) " % (checkCompiler, os.path.join(root, f)) 
      check_call(["diff", str1, str2]) 

Warum erhalte ich folgenden Fehler?

diff: <(./espressoc ./Tests/Espresso/GoodTests/Init.java) : No such file or directory 
diff: <(./espressocr ./Tests/Espresso/GoodTests/Init.java) : No such file or directory 
Traceback (most recent call last): 
    File "runTest.py", line 21, in <module> 
    check_call(["diff", str1, str2]) 
    File "/usr/lib/python3.5/subprocess.py", line 581, in check_call 
    raise CalledProcessError(retcode, cmd) 
subprocess.CalledProcessError: Command '['diff', '<(./espressoc ./Tests/Espresso/GoodTests/Init.java) ', '<(./espressocr ./Tests/Espresso/GoodTests/Init.java) ']' returned non-zero exit status 2 

Wenn ich diesen Befehl von meiner Shell ausführen würde, funktioniert es gut.

Antwort

0

diff beschwert sich, dass es die Datei mit dem seltsamen Namen <(./espressoc ./Tests/Espresso/GoodTests/Init.java) nicht finden kann, weil das das Argument ist, dass Sie es fütterten.

subprocess.Popen (check_call ist eine Komfortfunktion für sie) ist direkt aufrufen, was Sie geben, gibt zu interpretieren Umleitungen oder irgendetwas nicht eine Schale ist, wenn Sie es shell=True sagen, die den Befehl dann nennen über /bin/sh (auf POSIX). Notieren Sie sich die security considerations vor der Verwendung.

Also im Grunde:

subprocess.check_call(['diff', '<this', '<that'])` # strange files. 
subprocess.check_call('diff <this <that', shell=True)` # /bin/sh does some redirection 

Wenn Sie (wahrscheinlich mehr Mühe, als es wert ist) als „reine“ wollte, ich glaube, Sie könnten alle drei Prozesse Teilprozess (diff, Compiler 1 und 2) und behandeln die sich selbst verpfeifen. Warten diff auf 2 EOFs oder etwas vor dem Schließen von Stdin? Nicht sicher, wie es sich mit der doppelten Eingabeumleitung verhält, wie Ihre Zeile hat ...

Verwandte Themen