Wie verwende ich Python, um einen Curl-Befehl auszuführen?

171

Ich möchte einen Curl-Befehl in Python ausführen.

Normalerweise muss ich nur den Befehl im Terminal eingeben und die Eingabetaste drücken. Ich weiß jedoch nicht, wie es in Python funktioniert.

Der Befehl zeigt unten:

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

Es muss eine request.json-Datei gesendet werden, um eine Antwort zu erhalten.

Ich habe viel gesucht und war verwirrt. Ich habe versucht, einen Code zu schreiben, obwohl ich ihn nicht vollständig verstehen konnte. Es hat nicht funktioniert.

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

Die Fehlermeldung lautet "Fehler analysieren". Kann mir jemand sagen, wie ich das Problem beheben kann? oder wie bekomme ich die Antwort vom Server richtig?

Qiang Fu
quelle
1
Können Sie den Traceback des Fehlers einschließen?
Shaktimaan
1
FWIW, haben Sie darüber nachgedacht, pycurl als "Python-Bindung an cURL" zu verwenden ? Abhängig von Ihren Anforderungen ist dies möglicherweise effizienter / bequemer als das Aufrufen des Befehlszeilenprogramms hinter den Kulissen.
Sylvain Leroux
3
Müssen Sie cURL verwenden? Haben Sie Anfragen berücksichtigt ? Könnte einfacher sein, besonders wenn Sie Python noch nicht kennen, was eher unversöhnlich ist.
Vch
3
ähm Python ist ziemlich verzeihend ... vielleicht nicht locken
Joran Beasley

Antworten:

191

Der Einfachheit halber sollten Sie möglicherweise die Verwendung der Anforderungsbibliothek in Betracht ziehen .

Ein Beispiel mit json-Antwortinhalten wäre etwa:

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

Wenn Sie nach weiteren Informationen suchen, finden Sie im Abschnitt Schnellstart viele Arbeitsbeispiele.

BEARBEITEN:

Für Ihre spezifische Curl-Übersetzung:

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)
Otorrillas
quelle
1
Bitte @tricknology, versuchen Sie, nach dem Fehler zu suchen, und stellen Sie eine neue Frage, falls Sie keine richtige Lösung finden.
Otorrillas
4
Sollte dies jemand anderes sehen, war der Grund, warum mir das passiert ist, dass ich anstelle eines Wörterbuchobjekts eine Zeichenfolge als Nutzlast angegeben habe.
Tricknologie
1
Es scheint, dass es einen kleinen Tippfehler in den Überschriften gibt, der lauten sollte'Accept-Charset': 'UTF-8'
Stephen Lead
1
Das Öffnen der Datei und das Parsen von JSON vor dem Senden ist unnötig ineffizient. Sie analysieren den JSON und konvertieren ihn dann mit json.dumps () zurück in einen String. Das ist eine schlechte Antwort.
Nathan K
4
Requestsist eine zusätzliche Abhängigkeit, die Sie installieren und verwalten müssen. Eine einfache Lösung, die nur die Standardbibliothek verwendet, finden Sie unter stackoverflow.com/a/13921930/111995
geekQ
93

Verwenden Sie einfach diese Website . Jeder Curl-Befehl wird in Python, Node.js, PHP, R oder Go konvertiert.

Beispiel:

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

Wird dies in 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)
Kyle Bridenstine
quelle
3
Um sicherzustellen, dass Ihr JSON korrekt formatiert ist, importieren Sie das "json" -Modul und verwenden Sie json.dumps (Nutzdaten) für die Datennutzdaten, dh data = json.dumps (Daten) im obigen Fall
Richard Bown
23
import requests
url = "https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere"
data = requests.get(url).json

vielleicht?

Wenn Sie versuchen, eine Datei zu senden

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

ahh danke @LukasGraf jetzt verstehe ich besser, was sein ursprünglicher Code tut

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? 
Joran Beasley
quelle
Das schließt jedoch keine Daten aus der requests.jsonDatei ein und setzt den Content-Type: application/jsonHeader nicht - außerdem wird eine GETAnfrage gesendet, keine POST.
Lukas Graf
1
curl -d @<file>liest die Felder , aus denen gepostet werden soll <file>- das ist nicht dasselbe wie das Hochladen von Dateien.
Lukas Graf
@ LukasGraf danke :) ... Ich benutze nicht viel Locken (lesen: fast nie)
Joran Beasley
Eine kleine Anmerkung data = requests.get(url).jsonsollte seindata = requests.get(url).json()
dpg5000
2014 war es eine Immobilie, jetzt ist es eine Funktion :) Guter Anruf
Joran Beasley
19
curl -d @request.json --header "Content-Type: application/json" https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere

seine Python-Implementierung ist wie

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)

Wenn Sie diesen Link überprüfen , können Sie den Befehl cURl in Python, PHP und NodeJS konvertieren

cryptoKTM
quelle
8

Meine Antwort lautet 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

Ich entschuldige mich dafür, dass ich die erforderlichen Parameter nicht angegeben habe, da dies vertraulich ist.

apoorva_bhat
quelle
Wenn Sie einige spezielle Optionen von Curl wie --resolve verwenden müssen, ist dies der richtige Weg. Danke dir.
Nikoskip
Wie kann ich nur den zurückgegebenen JSON ohne die tabellarische
Statistik erhalten
5

Einige Hintergrundinformationen: Ich habe genau nach dieser Frage gesucht, weil ich etwas tun musste, um Inhalte abzurufen, aber alles, was mir zur Verfügung stand, war eine alte Version von Python mit unzureichender SSL-Unterstützung. Wenn Sie ein älteres MacBook verwenden, wissen Sie, wovon ich spreche. Läuft auf jeden Fall curlgut über eine Shell (ich vermute, es ist moderne SSL-Unterstützung eingebunden), so dass Sie dies manchmal tun möchten, ohne requestsoder zu verwendenurllib2 .

Sie können das subprocessModul verwenden, um curlden abgerufenen Inhalt auszuführen und abzurufen:

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

Das subprocessModul von Python 3 enthält außerdem .run()eine Reihe nützlicher Optionen. Ich überlasse es jemandem, der tatsächlich Python 3 ausführt, diese Antwort zu geben.

Joemadeus
quelle
-4

Dies könnte mit dem unten erwähnten Pseudo-Code-Ansatz erreicht werden

Import os Importanfragen Data = os.execute (Curl URL) R = Data.json ()

user9761315
quelle
os.system statt os.execute, und Anfragen scheinen in diesem Fall unnötig
SeanFromIT