2013-12-13 221 views
3

我在Ubuntu 12.這個subprocess.check_call()爲什麼不起作用?

import subprocess 
args = ['rsync', '--rsh="ssh"', '/tmp/a/', '127.0.0.1:/tmp/b/'] 
subprocess.check_call(args) 

運行這些片段與Python 2.7失敗

import subprocess 
args = ['rsync', '--rsh="ssh"', '/tmp/a/', '127.0.0.1:/tmp/b/'] 
call_string = ' '.join(args) 
subprocess.check_call(call_string) 

作品

第一代碼段的結果的rsync得到一個無效的命令行。使用此選項的簡短版本(-e)沒有任何區別。如果我刪除了--rsh部分,它工作正常。

使用shell=True沒有任何區別。從「ssh」中刪除引號並沒有什麼區別,我想保留引號,以便將參數傳遞給ssh。

有什麼問題?

+0

第二個命令應該失敗。如果它能夠工作,那麼'check_call()'(或者它使用的函數)已經被'shell = True'重新定義了。用'shell = False'嘗試第一個命令(默認)。看看'print(inspect.getsource(subprocess.check_call))' – jfs

+0

順便說一句,你是否需要這個選項呢?我的'rsync'在過去的10年中總是在'ssh'上使用'ssh' ... – glglgl

+0

@glglglg:最後我想添加一些參數給rsync啓動的ssh實例。 – JivanAmara

回答

2

刪除ssh附近的引號;外殼通常已經解析了那些和傳遞參數的報價:

import subprocess 
args = ['rsync', '--rsh=ssh', '/tmp/a/', '127.0.0.1:/tmp/b/'] 
subprocess.check_call(args) 
+0

消除引號並沒有什麼區別。 – JivanAmara

+1

@JivanAmara:值得一提的是,這個調用適用於我,在Debian上。 –

+0

你使用的是什麼Python版本/操作系統? – JivanAmara