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

时间:2011-07-18 21:50:00

标签: python json curl cordova

我试图用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)

它有效。

但是,当我尝试使用像这样的子进程模块时......

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

...卷曲不起作用,我从使用的api中得到一个错误,我正在使用无效参数,这是我过去在使用不正确的转义json时得到的。< / p>

这里发生了什么?为什么我可以用os.system调用这个命令而不是subprocess.Popen?到目前为止,我的假设是分裂正在搞乱字符串中的某些东西,但是当我检查s.split()的输出时,我没有发现任何看起来错误的东西。

3 个答案:

答案 0 :(得分:6)

也许使用shell = True

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

答案 1 :(得分:4)

而不是做

s.split()

尝试使用标准库中的shlex

import shlex
shlex.split(s)

Shlex允许您配置转义行为(有关详细信息,请参阅链接,但默认值可能已足够)

答案 2 :(得分:1)

特别是你出错的地方是分裂:

  

\“另一个,   应用\ “}”

.split()# 

默认使用空格字符,您需要像其他人所说的那样更改拆分行为。