Cómo usar Python para ejecutar un comando curl

171

Quiero ejecutar un comando curl en python.

Por lo general, solo necesito ingresar el comando en la terminal y presionar la tecla de retorno. Sin embargo, no sé cómo funciona en Python.

El comando se muestra a continuación:

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

Hay un archivo request.json que se enviará para obtener respuesta.

Busqué mucho y me confundí. Traté de escribir un código, aunque no pude entenderlo completamente. No funcionó.

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

El mensaje de error es 'Parse Error'. ¿Alguien puede decirme cómo solucionarlo? o cómo obtener la respuesta del servidor correctamente?

Qiang Fu
fuente
1
¿Puedes incluir el rastreo del error?
shaktimaan
1
FWIW, ¿has considerado usar pycurl el "enlace de Python a cURL" ? Dependiendo de sus necesidades, puede ser más eficiente / conveniente que invocar la utilidad de línea de comandos detrás de escena.
Sylvain Leroux
3
¿Necesitas usar cURL? ¿Has considerado solicitudes ? Podría ser más simple, especialmente si eres nuevo en Python, que tiende a ser implacable.
vch
3
ummm python es bastante indulgente ... tal vez no se riza
Joran Beasley

Respuestas:

191

En aras de la simplicidad, tal vez debería considerar usar la biblioteca de solicitudes .

Un ejemplo con contenido de respuesta json sería algo como:

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

Si busca más información, en la sección Inicio rápido , tienen muchos ejemplos de trabajo.

EDITAR:

Para su traducción de rizo específica:

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
fuente
1
@Tricknology, intente buscar el error y, si no encuentra la solución adecuada, publique una nueva pregunta.
otorrillas
44
En caso de que alguien más vea esto, la razón por la que eso me estaba sucediendo es que estaba dando una cadena como mi carga útil en lugar de un objeto de diccionario.
tricknology
1
Parece que hay un pequeño error tipográfico en los encabezados, que debería leer'Accept-Charset': 'UTF-8'
Stephen Lead
1
Abrir el archivo y analizar JSON antes de enviarlo es innecesariamente ineficiente. Analiza el JSON y luego lo convierte de nuevo en una cadena con json.dumps (). Esta es una mala respuesta.
Nathan K
44
Requestses una dependencia adicional que necesita instalar y administrar. Para una solución simple usando solo la biblioteca estándar, consulte stackoverflow.com/a/13921930/111995
geekQ
94

Solo usa este sitio web . Convertirá cualquier comando curl en Python, Node.js, PHP, R o Go.

Ejemplo:

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

Se convierte en esto en 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
fuente
3
Para asegurarse de que su JSON esté formateado correctamente, importe el módulo "json" y use json.dumps (carga útil) en la carga útil de datos, es decir, datos = json.dumps (datos) en el caso anterior
Richard Bown
23
import requests
url = "https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere"
data = requests.get(url).json

¿tal vez?

si está intentando enviar un archivo

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

ahh gracias @LukasGraf ahora entiendo mejor lo que hace su código original

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
fuente
Sin embargo, eso no incluye datos del requests.jsonarchivo y no establece el Content-Type: application/jsonencabezado; además, esto enviará una GETsolicitud, no un POST.
Lukas Graf
1
curl -d @<file>leerá los campos para publicar <file>, eso no es lo mismo que cargar archivos.
Lukas Graf
@LukasGraf gracias :) ... No uso mucho el rizo (léase: casi nunca)
Joran Beasley
Una pequeña nota, data = requests.get(url).jsondebería serdata = requests.get(url).json()
dpg5000
en 2014 era una propiedad ahora es una función :) aunque buena llamada
Joran Beasley
19
curl -d @request.json --header "Content-Type: application/json" https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere

su implementación de Python sea como

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)

verifique este enlace , ayudará a convertir el comando cURl a python, php y nodejs

cryptoKTM
fuente
8

Mi respuesta es 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

Pido disculpas por no proporcionar los parámetros necesarios porque es confidencial.

apoorva_bhat
fuente
Si necesita usar algunas opciones especiales de curl como --resolve, esta es la forma. Gracias.
nikoskip
¿Cómo puedo obtener el json devuelto sin la estadística tabular
Grant Gubatan
5

Algunos antecedentes: busqué exactamente esta pregunta porque tenía que hacer algo para recuperar el contenido, pero todo lo que tenía disponible era una versión antigua de python con soporte SSL inadecuado. Si estás en una MacBook anterior, sabes de lo que estoy hablando. En cualquier caso, curlfunciona bien desde un shell (sospecho que tiene un soporte SSL moderno vinculado), por lo que a veces desea hacer esto sin usar requestso urllib2.

Puede usar el subprocessmódulo para ejecutar curly obtener el contenido recuperado:

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

El subprocessmódulo de Python 3 también contiene .run()varias opciones útiles. Se lo dejaré a alguien que realmente esté ejecutando Python 3 para que brinde esa respuesta.

joemadeus
fuente
-4

Esto podría lograrse con el enfoque del código psuedo mencionado a continuación

Importar solicitudes de importación de datos Data = os.execute (curl URL) R = Data.json ()

usuario9761315
fuente
os.system en lugar de os.execute, y las solicitudes parecen innecesarias en este caso
SeanFromIT