web-dev-qa-db-fra.com

Exécuter la commande curl dans un script Python

J'essaie d'exécuter une commande curl dans un script python.

Si je le fais dans le terminal, cela ressemble à ceci:

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

J'ai vu des recommandations d'utiliser pycurl, mais je ne savais pas comment l'appliquer à la mienne.

J'ai essayé d'utiliser:

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

et cela fonctionne, mais y a-t-il un meilleur moyen?

42
Kiran Vemuri

Vous pouvez utiliser urllib comme @roippi a dit:

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

Si vous ne modifiez pas trop la commande curl, vous pouvez également appeler directement la commande curl.

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

Utilisez cet outil (hébergé ici gratuitement) pour convertir votre commande curl en code de requête Python équivalent:

Exemple: Ceci,

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

Se convertit parfaitement en:

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

En reformulant l’une des réponses de cet article, au lieu d’utiliser cmd.split (). Essayez d'utiliser: 

import shlex

args = shlex.split(cmd)

Ensuite, alimentez args vers subprocess.Popen.

Consultez cette documentation pour plus d’informations: https://docs.python.org/2/library/subprocess.html#popen-constructor

0
Ganesh prasad