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()
Reformular una de las respuestas en esta publicación, en lugar de usar cmd.split (). Tratar de usar:
import shlex
args = shlex.split(cmd)
A continuación, alimente args para subprocesar. Popen.
Consulte este documento para obtener más información: https://docs.python.org/2/library/subprocess.html#popen-constructor
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)