2014-03-26 187 views
2

時呼籲蟒子我試圖篩選是通過一個函數在Python腳本生成的文件:錯誤重定向標準輸出

out = subprocess.check_output(["sed","-n","'s/pattern/&/p'",oldFile,">",newFile]) 

但是,我得到了我的命令followong錯誤:

returned non-zero exit status 1 

有什麼不對?

+1

重定向操作符由shell解釋。 – devnull

回答

3

正如devnull所述,>由shell解釋。既然是better to avoid using shell=True,使用stdout參數,而不是:

import subprocess 
with open(newFile, 'w') as newFile: 
    subprocess.check_call(
     ["sed", "-n", "s/S/&/p", oldFile], stdout=newFile) 
+0

@Martijn和unutbu:我得到:stdout參數不允許,它將被覆蓋 – bigTree

+0

使用'check_output',stdout參數是不允許的,因爲它在內部使用。改用Popen。 – unutbu

+0

或者使用'call()'或'check_call()'。 –

2

您使用>重定向,這需要一個shell來解釋語法。

當您重定向sed的輸出時,這裏沒有意義的是使用check_output。改爲使用subprocess.call()subprocess.check_call()並驗證返回碼。

既可以通過外殼運行命令:

import pipes 

out = subprocess.call("sed -n 's/S/&/p' {} > {}".format(
    pipes.quote(oldFile), pipes.quote(newFile), shell=True) 

或使用管道:

with open(newFile, 'w') as pipetarget: 
    out = subprocess.call(["sed", "-n", "s/S/&/p", oldFile], 
            stdout=pipetarget) 

注意的是,由於單獨的參數使用時,你不應該在's/S/&/p'字符串中使用引號參數列表;當不將它傳遞給shell時,它不需要從shell解析中逃脫。

相關問題