script ejecutar desde archivos python python-2.7 curl pycurl

desde - ejecutar script python en windows



Ejecute el comando curl dentro de un script de Python (5)

Estoy intentando ejecutar un comando curl dentro de un script python.

Si lo hago en la terminal, se ve así:

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

He visto recomendaciones para usar pycurl , pero no pude encontrar la manera de aplicarlo al mío.

Intenté usar:

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

y funciona, pero ¿hay una mejor manera?


¡No!

Lo sé, esa es la "respuesta" que nadie quiere. Pero si algo vale la pena, vale la pena hacerlo bien , ¿verdad?

Parece una buena idea, probablemente debido a una idea errónea bastante amplia de que los comandos de shell como curl son cualquier cosa que no sean los programas mismos.

Entonces, lo que estás preguntando es "¿cómo puedo ejecutar este otro programa, desde mi programa, solo para hacer una pequeña petición web?". Eso es una locura, tiene que haber una mejor manera, ¿verdad?

La respuesta de Uxio funciona, claro. Pero apenas se ve muy pitónico , ¿verdad? Eso es mucho trabajo solo por una pequeña solicitud. Python se supone que se trata de flying ! ¡Cualquiera que escriba eso probablemente desea que lo call ''r curl !

funciona, pero ¿hay una mejor manera?

Sí, ¡hay una mejor manera!

Solicitudes: HTTP para humanos

Las cosas no deberían ser de esta manera. No en Python.

Vamos a CONSEGUIR esta página:

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

¡Eso es todo! A continuación, tiene el resultado res.text sin res.text , o res.json() , res.headers , etc.

Puede ver los documentos (vinculados anteriormente) para obtener detalles sobre cómo configurar todas las opciones, ya que imagino que OP se ha movido por ahora, y usted, el lector ahora, probablemente necesite otras.

Pero, por ejemplo, es tan simple como:

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

Incluso puede usar un buen dict de Python para suministrar la cadena de consulta en una solicitud GET con params={} .

Simple y elegante. Mantenga la calma y vuele.


Podría usar urllib como @roippi dijo:

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



Si no está modificando demasiado el comando curl, también puede ir y llamar al comando Curl directamente

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 = cmd.split() process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.communicate()


Utilice esta tool (alojada here gratis) para convertir su comando curl al código de solicitud de Python equivalente:

Ejemplo: Esto,

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 convierte prolijamente 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)