为什么不这subprocess.check_call()工作?

我在Ubuntu 12上使用Python 2.7运行这些片段。

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

失败

 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 )没有任何区别。 如果我删除 – – 部分工作正常。

使用shell=True并没有什么区别。 从“ssh”消除引号没有任何区别,我想保留引号,所以我可以传递参数给ssh。

有什么问题?

删除ssh周围的引号; shell通常会解析并传递参数而不加引号:

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