subprocess.Popen未正确转义命令行参数?

4 投票
3 回答
6131 浏览
提问于 2025-04-16 21:48

我正在尝试用Python调用以下的curl命令:

curl -k -F file=@something.zip -F "data={\\"title\\":\\"Another App\\"}" -Lu usr:pwd https://build.phonegap.com/api/v0/apps

为了让它正常工作,我发现我传入的数据中的json需要用反斜杠进行转义。

我可以这样调用这个命令...

os.system(curl -k -F file=@something.zip -F "data={\\"title\\":\\"Another App\\"}" -Lu usr:pwd https://build.phonegap.com/api/v0/apps)

而且它可以正常运行。

但是,当我尝试像这样使用subprocess模块时...

s = 'curl -k -F file=@something.zip -F "data={\\"title\\":\\"Another App\\"}" -Lu usr:pwd https://build.phonegap.com/api/v0/apps'
push = subprocess.Popen(s.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, errors = push.communicate()
print output

...curl就不工作了,我收到了来自我使用的API的错误提示,说明我使用了无效的参数,这种情况我以前也遇到过,当我没有正确转义json时就会出现这个问题。

这是怎么回事呢?为什么我可以用os.system来调用这个命令,而用subprocess.Popen却不行?到目前为止,我的猜测是split在字符串中搞错了什么,但当我检查s.split()的输出时,并没有发现任何看起来不对的地方。

3 个回答

1

你出错的地方具体在于你在这里进行了分割:

\"Another, App\"}"

.split()# 

默认情况下,分割是用空格来进行的,所以你需要像其他人说的那样,改变一下分割的方式。

4

与其这样做

s.split()

不如试试使用shlex,这是标准库里的一个工具。

import shlex
shlex.split(s)

Shlex可以让你设置如何处理特殊字符(具体细节可以查看链接,默认设置可能已经足够用了)。

7

也许可以试试使用 shell=True

push = subprocess.Popen(s, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

撰写回答