subprocess.Popen未正确转义命令行参数?
我正在尝试用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)