【问题标题】:subprocess.Popen not escaping command line arguments properly?subprocess.Popen 没有正确转义命令行参数?
【发布时间】:2011-07-18 21:49:59
【问题描述】:

我正在尝试使用 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

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

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

【问题讨论】:

    标签: python json curl cordova


    【解决方案1】:

    也许使用 shell=True

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

    【讨论】:

      【解决方案2】:

      而不是做

      s.split()
      

      尝试使用标准库中的shlex

      import shlex
      shlex.split(s)
      

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

      【讨论】:

      • 我试过了,它最终吃掉了我在文件路径中的所有反斜杠。将来我应该使用这个模块,但现在我将使用 shell=True
      【解决方案3】:

      特别是你出错的地方是:

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

      .split()# 
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-25
        • 2020-05-27
        • 1970-01-01
        相关资源
        最近更新 更多