gpt4 book ai didi

python: subprocess.Popen() 行为

转载 作者:行者123 更新时间:2023-11-28 16:47:15 24 4
gpt4 key购买 nike

我正在尝试将 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 key 来进行身份验证。

我认为这是执行新进程的环境问题。我接下来尝试的是:

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/'

最佳答案

I'd like to know what's the difference?

shell=True ,整个命令被传递给 shell。引号在那里,因此 shell 可以再次正确地分离命令。特别是通过

foo "bar baz"

shell 导致它将命令解析为(Python 语法)['foo', 'bar baz']以便它可以执行 foo带有参数 bar baz 的命令.

相比之下,当shell=False , Python 会立即将列表中的参数传递给程序。例如,尝试以下 subprocess命令:

>>> import subprocess
>>> subprocess.call(["echo", '"Hello!"'])
"Hello!"
0
>>> subprocess.call('echo "Hello!"', shell=True)
Hello!
0

请注意,在第一行中,echo 向您回显引号。程序,而在第二种情况下,shell 在执行 echo 之前将它们剥离了.

在您的具体情况下,rsync得到报价但不知道应该如何处理它们;毕竟,它本身并不是一个外壳。

关于python: subprocess.Popen() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12495867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com