【发布时间】:2012-09-19 13:34:07
【问题描述】:
我正在尝试将 rsync 与 python 一起使用。我已经读过将参数传递给 Popen 的首选方法是使用数组。
我试过的代码:
p = Popen(["rsync",
"\"{source}\"".format(source=latestPath),
"\"{user}@{host}:{dir}\"".format(user=user, host=host, dir=dir)],
stdout=PIPE, stderr=PIPE)
结果是 rsync 要求输入密码,即使我已经设置了 SSH 密钥来进行身份验证。
我认为这是执行新进程的环境的问题。我接下来尝试的是:
p = Popen(["rsync",
"\"{source}\"".format(source=latestPath),
"\"{user}@{host}:{dir}\"".format(user=user, host=host, dir=dir)],
stdout=PIPE, stderr=PIPE, shell=True)
这会导致 rsync 打印“正确用法”,因此参数被错误地传递给 rsync。我不确定这是否应该工作(传递一个带有 shell=True 的数组)
如果我像这样完全删除数组:
p = Popen("rsync \"{source}\" \"{user}@{host}:{dir}\"".format(
source=latestPath, user=user, host=host, dir=dir),
stdout=PIPE, stderr=PIPE, shell=True)
程序运行良好。为了这个脚本,这真的没关系,但我想知道有什么区别?为什么其他两个(主要是第一个)不起作用?
难道只是需要shell环境,第二个不对?
编辑:变量的内容
latestPath='/home/tomcat/.jenkins/jobs/MC 4thworld/workspace/target/FourthWorld-0.1-SNAPSHOT.jar'
user='mc'
host='192.168.0.32'
dir='/mc/test/plugins/'
【问题讨论】:
-
如果您使用命令的列表语法,我认为您不需要额外的引号
\"。所以你可以: `Popen([ 'rsync', latestPath, '{user}@{host}:{dir}'.format(user=user, host=host, dir=dir) ]) -
@hwjp 如果引号不存在,它如何处理路径中的空格?
-
第二个也是正确的。即使使用
shell=True,子进程也会接受一个数组。事实上,在我的系统上,该命令有效(source、user、host和dir的虚拟值。变量的内容是什么? -
空格应该没问题。试试看。
-
@HansThen 我添加了变量的示例内容
标签: python subprocess popen