web-dev-qa-db-fra.com

comment utiliser python pour exécuter une commande curl

Je veux exécuter une commande curl en python.

Habituellement, je dois juste entrer la commande dans le terminal et appuyer sur la touche Retour. Cependant, je ne sais pas comment cela fonctionne en python.

La commande montre ci-dessous:

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

Un fichier request.json doit être envoyé pour obtenir une réponse.

J'ai beaucoup cherché et je me suis perdu. J'ai essayé d'écrire un morceau de code, bien que je ne comprenais pas bien. Ça n'a pas marché.

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()

Le message d'erreur est 'Parse Error'. Est-ce que quelqu'un peut me dire comment résoudre ce problème? ou comment obtenir une réponse du serveur correctement?

122
Qiang Fu

Par souci de simplicité, vous devriez peut-être envisager d'utiliser la bibliothèque Requests .

Un exemple avec le contenu de réponse json serait quelque chose comme:

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

Si vous recherchez des informations supplémentaires, dans la section Quickstart , ils contiennent de nombreux exemples de travail.

EDIT:

Pour votre traduction curl spécifique:

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)
139
otorrillas

Il suffit d'utiliser ce site . Il convertira n'importe quelle commande curl en Python, Node.js, PHP, R ou Go.

Exemple:

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

Devient ceci en 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)
58
Kyle Bridenstine
import requests
url = "https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere"
data = requests.get(url).json

peut être?

si vous essayez d'envoyer un fichier

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

ahh merci @LukasGraf maintenant je comprends mieux ce que fait son code original

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? 
17
Joran Beasley
curl -d @request.json --header "Content-Type: application/json" https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere

son implémentation python soit comme

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)

check ce lien, cela aidera à convertir la commande cURl en python, php et nodejs

15
cryptoKTM

Il existe un site Web de Nice https://curl.trillworks.com/ qui effectue la conversion à votre place. Il convertit cURL en Python, Node.js, R, PHP, Go.

8
Edgar Manukyan

Ma réponse est 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

Je m'excuse de ne pas fournir les paramètres requis car c'est confidentiel.

4
apoorva_bhat

Un peu d’arrière-plan: j’ai cherché précisément cette question parce que je devais faire quelque chose pour récupérer du contenu, mais tout ce dont je disposais, c’était une ancienne version de python avec un support SSL insuffisant. Si vous utilisez un ancien MacBook, vous savez de quoi je parle. Dans tous les cas, curl fonctionne correctement à partir d'un shell (je suppose qu'il est lié au support SSL moderne), aussi vous voulez parfois le faire sans utiliser requests ou urllib2.

Vous pouvez utiliser le module subprocess pour exécuter curl et obtenir le contenu récupéré:

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])

Le module subprocess de Python 3 contient également .run() avec un certain nombre d'options utiles. Je laisse le soin à quelqu'un qui exécute en fait python 3 de fournir cette réponse.

2
joemadeus
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)
0
Shafay