webentwicklung-frage-antwort-db.com.de

Führen Sie den curl-Befehl innerhalb eines Python-Skripts aus

Ich versuche, einen curl-Befehl innerhalb eines Python-Skripts auszuführen.

Wenn ich es im Terminal mache, sieht es so aus:

curl -X POST -d  '{"nw_src": "10.0.0.1/32", "nw_dst": "10.0.0.2/32", "nw_proto": "ICMP", "actions": "ALLOW", "priority": "10"}' http://localhost:8080/firewall/rules/0000000000000001

Ich habe Empfehlungen zur Verwendung von pycurl gesehen, konnte jedoch nicht herausfinden, wie ich sie auf meine anwenden kann.

Ich habe versucht mit:

subprocess.call([
    'curl',
    '-X',
    'POST',
    '-d',
    flow_x,
    'http://localhost:8080/firewall/rules/0000000000000001'
])

und es funktioniert, aber gibt es einen besseren Weg?

42
Kiran Vemuri

Sie könnten urllib verwenden, wie @roippi sagte:

import urllib2
data = '{"nw_src": "10.0.0.1/32", "nw_dst": "10.0.0.2/32", "nw_proto": "ICMP", "actions": "ALLOW", "priority": "10"}'
url = 'http://localhost:8080/firewall/rules/0000000000000001'
req = urllib2.Request(url, data, {'Content-Type': 'application/json'})
f = urllib2.urlopen(req)
for x in f:
    print(x)
f.close()
26
Uxio

Nicht!

Ich weiß, das ist die "Antwort", die niemand will. Aber wenn es sich lohnt, etwas zu tun, es lohnt sich, es richtig zu machen, richtig?

Dies scheint eine gute Idee zu sein, die wahrscheinlich auf einem weit verbreiteten Missverständnis beruht, dass Shell-Befehle wie curl alles andere als Programme selbst sind.

Sie fragen sich also: "Wie starte ich dieses andere Programm in meinem Programm, um nur eine kleine Webanforderung zu stellen?". Das ist verrückt, es muss doch einen besseren Weg geben, oder?

xios Antwort funktioniert, klar. Aber es sieht kaum sehr gut aus Pythonic, oder? Das ist eine Menge Arbeit, nur für eine kleine Anfrage. Python soll ungefähr fliegend sein! Wer schreibt, der wünscht sich wahrscheinlich, dass er nur call 'd curl!


es funktioniert, aber gibt es einen besseren Weg?

Ja, es gibt ist einen besseren Weg!

Anfragen: HTTP für Menschen

Das sollte nicht so sein. Nicht in Python.

Lassen Sie uns diese Seite GET:

import requests
res = requests.get('https://stackoverflow.com/questions/26000336')

Das war's wirklich! Sie haben dann die rohe Ausgabe res.text Oder res.json(), die Ausgabe res.headers Usw.

In den oben verlinkten Dokumenten finden Sie Details zum Festlegen aller Optionen, da ich mir vorstelle, dass OP inzwischen übergegangen ist und Sie - der Leser jetzt - wahrscheinlich andere benötigen.

Aber zum Beispiel ist es so einfach wie:

url     = 'http://example.tld'
payload = { 'key' : 'val' }
headers = {}
res = requests.post(url, data=payload, headers=headers)

Sie können sogar ein Nice Python dict verwenden, um den Abfrage-String in einer GET-Anfrage mit params={} Zu versorgen.

Einfach und elegant. Bleib ruhig und flieg weiter.

142
OJFord

Wenn Sie den curl-Befehl nicht zu sehr anpassen, können Sie den curl-Befehl auch direkt aufrufen

import shlex
cmd = '''curl -X POST -d  '{"nw_src": "10.0.0.1/32", "nw_dst": "10.0.0.2/32", "nw_proto": "ICMP", "actions": "ALLOW", "priority": "10"}' http://localhost:8080/firewall/rules/0000000000000001'''
args = shlex.split(cmd)
process = subprocess.Popen(args, Shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
19
hyades

Verwenden Sie dieses tool (hosted here for free), um Ihren curl-Befehl in den entsprechenden Python-Anforderungscode zu konvertieren:

Beispiel: This,

curl 'https://www.example.com/' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' -H 'Origin: https://www.libib.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Cookie: SESSID=ABCDEF' --data-binary 'Pathfinder' --compressed

Wird ordentlich konvertiert in:

import requests

cookies = {
    'SESSID': 'ABCDEF',
}

headers = {
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
    'Origin': 'https://www.libib.com',
    'Accept-Encoding': 'gzip, deflate, br',
}

data = 'Pathfinder'

response = requests.post('https://www.example.com/', headers=headers, cookies=cookies, data=data)
4
Nitin Nain

Umformulieren Sie eine der Antworten in diesem Beitrag, anstatt cmd.split () zu verwenden. Versuchen zu benutzen: 

import shlex

args = shlex.split(cmd)

Dann führe args an subprocess.Popen.

In diesem Dokument finden Sie weitere Informationen: https://docs.python.org/2/library/subprocess.html#popen-constructor

0
Ganesh prasad