【问题标题】:Curl not working when called with subprocess使用子进程调用时,Curl 不起作用
【发布时间】:2016-05-04 18:28:48
【问题描述】:

我正在尝试使用 curl 调用 REST api。 api端点在程序中动态生成,同时上传一个json文件。

with open('data.json','w') as f:
    f.write(json.dumps(data))
    cmd = 'curl -X PUT -H "Content-Type: application/json" -d @data.json {0}'.format(put_uri)
    print cmd
    p= subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
    p.wait()
    output, errors = p.communicate()
    if p.returncode != 0:
        print "Request failed"

我在这里打印形成的命令,当我从 shell 运行该命令时,它正在按预期工作。但是使用 Popen 运行相同的命令会引发一些奇怪的 json 验证错误

{
  "success" : false,
  "message" : "Resource cannot be parsed due to Unexpected character ('/' (code 47)): maybe a (non-standard) comment? (not recognized as one since Feature 'ALLOW_COMMENTS' not enabled for parser)\n at [Source: java.io.StringReader@444c7495; line: 1, column: 2]"
}

【问题讨论】:

  • 由于shell=True,这是非常不安全的(想想如果您的put_uri 包含$(rm -rf ~) 会发生什么)。你有什么好的理由在这里这样做吗?
  • 除此之外,这听起来更像是您的数据问题,而不是 subprocess。验证您在命令行中使用的 URI 和 data.json 内容与您在此处使用的内容完全匹配。
  • ...为了解决安全问题,删除shell=True,并传递一个显式数组:['curl', '-X', 'PUT', '-H', 'Content-Type: application/json', '-d', '@data.json', str(put_uri)]
  • 哦!这里的一个潜在问题是您在调用curl 之前没有关闭/刷新data.json 文件句柄。
  • 当有用于 REST api 调用的库时,为什么要调用 curlsubprocess.Popen 或类似名称? stackoverflow.com/questions/17301938/…

标签: python curl subprocess python-2.6


【解决方案1】:

此代码无法确保在调用 curl 之前将 JSON 完全写入磁盘。

f.write(json.dumps(data)) 之后使用f.flush()f.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 2018-12-06
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多