2017-07-03 93 views
0

似乎我不能使用撇號,該命令失敗,沒有信息錯誤。 我試圖執行以下操作:使用撇號與python的子進程

secretLsCmd  = subprocess.Popen(('docker', 'secret', 'ls')  , stdout=subprocess.PIPE) 
    oneWhitespaceCmd = subprocess.Popen(('tr', '-s','" "')    , stdout=subprocess.PIPE, stdin=secretLsCmd.stdout) 
    onlySecretsCmd = subprocess.check_output(('cut', "-d' '", '-f2') , stdin=oneWhitespaceCmd.stdout) 
在一般的Linux終端

,它將執行以下命令:

docker secret ls | tr -s " " | cut -d' ' -f2 

運行此命令,在命令行工作正常,但一旦我把它在Python中它不工作。管道中的2個第一個命令工作正常(我已檢查),最後一個命令不工作,退出與錯誤代碼1 ...我幾乎100%肯定它是-d'',但我怎麼能修復?任何想法?

+0

在撇號之前使用反斜槓:'\'',它應該可以工作 – Stack

+0

已經嘗試過..不工作 – toto

回答

1

這條線:

oneWhitespaceCmd = subprocess.Popen(('tr', '-s','" "'), ...) 

實際運行:

tr -s '" "' 

,所以你不想失去有額外的雙引號:Python會引用任何參數,它需要引用的外殼。

此命令:

onlySecretsCmd = subprocess.check_output(('cut', "-d' '", '-f2'), ...) 

相當於shell命令:

cut '-d'"'"' '"'"'' -f2 

如此反覆,你可能只是不想失去引號一輪空白:

onlySecretsCmd = subprocess.check_output(('cut', "-d ", '-f2'), ...) 

並在需要時將其留給Python插入引號。這將實際運行(什麼應該相當於你想要什麼雖然不完全相同):

cut '-d ' -f2 

我以前shlex.quote()創建一個shell相當於你正在運行的命令,但在實踐中,除非你告訴subprocess調用shell會執行相當於命令bash在解析所有轉義引號後執行的命令。所以在內部逃脫不會發生,但用於區分參數的引號也不需要。

+0

謝謝你,非常有幫助=) – toto