作为命令行

时间:2018-06-15 08:08:41

标签: python curl subprocess pycurl

目前,我正在尝试将CURL请求转换为Python脚本。

curl $(curl -u username:password -s https://api.example.com/v1.1/reports/11111?fields=download | jq ".report.download" -r) > "C:\sample.zip"

由于知识限制,我尝试过pycurl但没有成功。

作为一种解决方案,我发现可以通过python运行命令。 https://www.raspberrypi.org/forums/viewtopic.php?t=112351

import os
os.system("curl -K.........")

使用子流程

的其他解决方案(基于搜索更常见)
import subprocess

subprocess.call(['command', 'argument'])

目前,我不知道该搬到哪里,以及如何使这个解决方案适应我的目标。

import os

os.system("curl $(curl -u username:password -s https://api.example.com/v1.1/reports/11111?fields=download | jq '.report.download' -r) > 'C:\sample.zip'")

'curl' is not recognized as an internal or external command,
operable program or batch file.
255

P.S。 - 更新v1

有什么建议吗?

import requests

response = requests.get('https://api.example.com/v1.1/reports/11111?fields=download | jq ".report.download" -r', auth=('username', 'password'))

这项工作没有" | jq ".report.download"这一部分,但这是最后只提供下载文件链接的主要部分。

围绕它吗?

2 个答案:

答案 0 :(得分:1)

错误'curl' is not recognized as an internal or external command表示python无法找到curl的安装位置。如果您已经安装了curl,请尝试提供安装curl的完整路径。例如,如果curl.exe位于C:\ System32中,则尝试

import os

os.system("C:\System32\curl $(curl -u username:password -s https://api.example.com/v1.1/reports/11111?fields=download | jq '.report.download' -r) > 'C:\sample.zip'")

但那肯定不是pythonic的做事方式。我建议使用requests模块。 您需要为此调用两次请求模块,首先从https://api.example.com/v1.1/reports/11111?fields=download下载json内容,获取report.download指向的新URL,然后再次调用请求以从新URL下载数据。

这些方面的某些内容应该让你前进

import requests

url        = 'https://api.example.com/v1.1/reports/11111'
response   = requests.get(url, params=(('fields', 'download'),),
                          auth=('username', 'password'))

report_url = response.json()['report']['download']
data = requests.get(report_url).content

with open('C:\sample.zip', 'w') as f:
    f.write(data)

答案 1 :(得分:0)

您可以使用此网站将命令的实际卷曲部分转换为适用于请求的内容:https://curl.trillworks.com/

从那里,只需使用请求对象的.json()方法来执行您需要进行的任何处理。

最后,可以像这样保存:

import json
with open('C:\sample.zip', 'r') as f:
    json.dump(data, f)