如何使用python执行curl命令


171

我想在python中执行curl命令。

通常,我只需要在终端中输入命令并按回车键即可。但是,我不知道它如何在python中工作。

该命令显示如下:

curl -d @request.json --header "Content-Type: application/json" https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere

有一个request.json文件要发送以获得响应。

我搜索了很多,感到困惑。尽管我无法完全理解,但我还是尝试编写了一段代码。没用

import pycurl
import StringIO

response = StringIO.StringIO()
c = pycurl.Curl()
c.setopt(c.URL, 'https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere')
c.setopt(c.WRITEFUNCTION, response.write)
c.setopt(c.HTTPHEADER, ['Content-Type: application/json','Accept-Charset: UTF-8'])
c.setopt(c.POSTFIELDS, '@request.json')
c.perform()
c.close()
print response.getvalue()
response.close()

错误信息为“解析错误”。有人可以告诉我如何解决吗?或如何正确获取服务器的响应?


1
您可以包括错误的追溯吗?
shaktimaan 2014年


1
FWIW,你有没有考虑使用pycurl“Python绑定卷曲”?根据您的需求,它可能比在后台调用命令行实用程序更为有效/方便。
西尔文·勒鲁

3
您需要使用cURL吗?您是否考虑过请求?可能会更简单,尤其是如果您是python的新手,这往往会让人宽容。
vch 2014年

3
ummm python非常宽容....也许不卷曲
Joran Beasley

Answers:


191

为了简单起见,也许您应该考虑使用Requests库。

带有json响应内容的示例如下所示:

import requests
r = requests.get('https://github.com/timeline.json')
r.json()

如果您需要更多信息,请在“ 快速入门”部分中找到许多可行的示例。

编辑:

对于您特定的curl翻译:

import requests
url = 'https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere'
payload = open("request.json")
headers = {'content-type': 'application/json', 'Accept-Charset': 'UTF-8'}
r = requests.post(url, data=payload, headers=headers)

1
请@tricknology,尝试搜索该错误,如果找不到合适的解决方案,请发布新问题。
otorrillas 2015年

4
如果其他任何人碰巧看到了这种情况,发生在我身上的原因是我给出了一个字符串作为我的有效负载,而不是字典对象。
tricknology 2015年

1
标头中似乎有一个小的错字,应显示为'Accept-Charset': 'UTF-8'
Stephen Lead

1
在发送文件之前打开文件并解析JSON是不必要的,效率低下。您解析JSON,然后使用json.dumps()将其转换回字符串。这是一个不好的答案。
弥敦道K

4
Requests是您需要安装和管理的额外依赖项。有关仅使用标准库的简单解决方案,请参见stackoverflow.com/a/13921930/111995
geekQ,

93

只要使用这个网站。它将任何curl命令转换为Python,Node.js,PHP,R或Go。

例:

curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/asdfasdfasdf

在Python中成为这个

import requests

headers = {
    'Content-type': 'application/json',
}

data = '{"text":"Hello, World!"}'

response = requests.post('https://hooks.slack.com/services/asdfasdfasdf', headers=headers, data=data)

3
为了确保您的JSON格式正确,请导入“ json”模块,并在上述情况下对数据有效负载使用json.dumps(payload),即data = json.dumps(data)
Richard Bown,

23
import requests
url = "https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere"
data = requests.get(url).json

也许?

如果您要发送文件

files = {'request_file': open('request.json', 'rb')}
r = requests.post(url, files=files)
print r.text, print r.json

啊,谢谢@LukasGraf现在,我更好地了解了他的原始代码在做什么

import requests,json
url = "https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere"
my_json_data = json.load(open("request.json"))
req = requests.post(url,data=my_json_data)
print req.text
print 
print req.json # maybe? 

但这不包括requests.json文件中的数据,也没有设置Content-Type: application/json标头-同样,这将发送GET请求,而不是POST
卢卡斯·格拉夫

1
curl -d @<file>将读取要发布的字段<file> -与文件上传不同。
卢卡斯·格拉夫

@LukasGraf谢谢:) ...我不怎么使用curl(阅读:几乎从不)
Joran Beasley

一个小注意事项data = requests.get(url).json应该是data = requests.get(url).json()
dpg5000

在2014年它是一个属性,现在它具有一个功能:)不错的选择
Joran Beasley,

19
curl -d @request.json --header "Content-Type: application/json" https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere

它的python实现就像

import requests

headers = {
    'Content-Type': 'application/json',
}

params = (
    ('key', 'mykeyhere'),
)

data = open('request.json')
response = requests.post('https://www.googleapis.com/qpxExpress/v1/trips/search', headers=headers, params=params, data=data)

#NB. Original query string below. It seems impossible to parse and
#reproduce query strings 100% accurately so the one below is given
#in case the reproduced version is not "correct".
# response = requests.post('https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere', headers=headers, data=data)

检查此链接,它将有助于将cURl命令转换为python,php和nodejs


8

我的答案是WRT python 2.6.2。

import commands

status, output = commands.getstatusoutput("curl -H \"Content-Type:application/json\" -k -u (few other parameters required) -X GET https://example.org -s")

print output

对于未提供必需的参数,我深表歉意,因为这是机密信息。


如果您需要使用curl的一些特殊选项(如--resolve),则可以使用这种方法。谢谢。
nikoskip

我如何只获取没有表格统计信息的返回json
Grant Gubatan

5

背景知识:我一直在寻找这个问题,因为我不得不做一些事情来检索内容,但是我所能得到的只是一个旧版本的python,它没有足够的SSL支持。如果您使用的是较旧的MacBook,那么您就会知道我在说什么。无论如何,都curl可以从Shell正常运行(我怀疑它已链接了现代SSL支持),因此有时您想要在不使用requests或的情况下执行此操作urllib2

您可以使用该subprocess模块执行curl并获取检索到的内容:

import subprocess

// 'response' contains a []byte with the retrieved content.
// use '-s' to keep curl quiet while it does its job, but
// it's useful to omit that while you're still writing code
// so you know if curl is working
response = subprocess.check_output(['curl', '-s', baseURL % page_num])

Python 3的subprocess模块还包含.run()许多有用的选项。我将其留给实际上正在运行python 3的人提供该答案。


-4

这可以通过下面提到的伪代码方法来实现

Import os导入请求Data = os.execute(curl URL)R = Data.json()


os.system而不是os.execute,在这种情况下,似乎不需要请求
SeanFromIT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.