2017-02-21 71 views
0

前言:我明白這個問題之前已經被問過了,但是我無法從查看以前的答案中找到解決方案。嘗試執行子進程調用時沒有這樣的文件或目錄

我想要做的就是撥打diff在同一個文件上輸出兩個不同的命令。

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]) 

爲什麼我收到以下錯誤?

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 

如果我要從我的shell運行這個命令,它工作正常。

回答

0

diff抱怨說找不到具有奇怪名稱<(./espressoc ./Tests/Espresso/GoodTests/Init.java)的文件,因爲這是您提供的參數。

subprocess.Popencheck_call是它的一個方便的功能)是直接叫你給什麼,有不是外殼解釋重定向或任何東西,除非你告訴它shell=True,然後將調用命令通過/bin/sh(在POSIX上)。使用前請注意security considerations

所以基本上:

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

如果你想成爲「純」(可能更多的努力比它的價值),我想你可以子過程的所有三個過程(DIFF,編譯器1和2)和處理給自己滾。 diff在關閉標準輸入前是否等待2個EOF或什麼?不知道它是如何處理像你的線路一樣的雙輸入重定向...

相關問題