2013-12-13 162 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