Как использовать Python для выполнения команды curl

171

Я хочу выполнить команду curl в python.

Обычно мне просто нужно ввести команду в терминале и нажать клавишу возврата. Тем не менее, я не знаю, как это работает в Python.

Команда показывает ниже:

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

Для получения ответа необходимо отправить файл request.json.

Я много искал и запутался. Я пытался написать кусок кода, хотя я не мог полностью понять. Это не сработало.

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

Сообщение об ошибке «Parse Error». Может кто-нибудь сказать мне, как это исправить? или как правильно получить ответ от сервера?

Цян Фу
источник
1
Можете ли вы включить трассировку ошибки?
Шактимаан
1
FWIW, вы рассмотрели с использованием pycurl в «Python привязки к скручиванию» ? В зависимости от ваших потребностей, это может быть более эффективным / удобным, чем запуск утилиты командной строки за кулисами.
Сильвен Леру
3
Вам нужно использовать cURL? Вы рассмотрели запросы ? Может быть проще, особенно если вы новичок в python, что, как правило, не прощает.
VCH
3
ммм питон довольно прощающий .... может быть, не скручивание
Джоран Бизли

Ответы:

191

Для простоты, возможно, вам следует рассмотреть возможность использования библиотеки запросов .

Пример с содержимым ответа json будет выглядеть примерно так:

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

Если вы ищете дополнительную информацию, в разделе « Быстрый старт » у них есть много рабочих примеров.

РЕДАКТИРОВАТЬ:

Для вашего конкретного перевода curl:

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
источник
1
Пожалуйста, @ tricknology, попробуйте найти ошибку и, если вам не удастся найти правильное решение, опубликуйте новый вопрос.
otorrillas
4
Если кто-то еще увидит это, причина, по которой это происходит со мной, заключается в том, что я предоставляю строку в качестве полезной нагрузки вместо словарного объекта.
tricknology
1
Кажется , есть небольшая опечатка в заголовках, которые следует читать'Accept-Charset': 'UTF-8'
Стивен Lead
1
Открытие файла и анализ JSON перед его отправкой излишне неэффективны. Вы анализируете JSON, а затем конвертируете его обратно в строку с помощью json.dumps (). Это плохой ответ.
Натан К
4
Requestsэто дополнительная зависимость, которую вы должны установить и управлять. Для простого решения , используя только стандартную библиотеку, см stackoverflow.com/a/13921930/111995
geekQ
94

Просто используйте этот сайт . Он преобразует любую команду curl в Python, Node.js, PHP, R или Go.

Пример:

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

Становится это в 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)
Кайл Бриденстайн
источник
3
Чтобы убедиться, что ваш JSON правильно отформатирован, импортируйте модуль «json» и используйте json.dumps (полезную нагрузку) в полезной нагрузке данных, т.е. data = json.dumps (data) в приведенном выше случае
Ричард Баун
23
import requests
url = "https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere"
data = requests.get(url).json

может быть?

если вы пытаетесь отправить файл

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

ааа спасибо @LukasGraf теперь я лучше понимаю, что делает его оригинальный код

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? 
Джоран Бизли
источник
Это не включает данные из requests.jsonфайла, и не устанавливает Content-Type: application/jsonзаголовок - также, это будет отправлять GETзапрос, а не POST.
Лукас Граф
1
curl -d @<file>будет читать поля для публикации <file>- это не то же самое, что загрузка файла.
Лукас Граф
@LukasGraf спасибо :) ... Я не пользуюсь локонами (читай: почти никогда)
Джоран Бизли
Одна небольшая заметка, data = requests.get(url).jsonдолжно бытьdata = requests.get(url).json()
dpg5000
в 2014 году это было свойство, теперь его функция :) хороший вызов, хотя
Joran Beasley
19
curl -d @request.json --header "Content-Type: application/json" https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere

его реализация Python будет как

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)

проверьте эту ссылку , она поможет конвертировать команду cURl в python, php и nodejs

cryptoKTM
источник
8

Мой ответ - 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

Я прошу прощения за то, что не предоставил необходимые параметры, потому что это конфиденциально.

apoorva_bhat
источник
Если вам нужно использовать некоторые специальные опции из curl, например --resolve, это путь. Спасибо.
Никоскип
как я могу получить только возвращенный JSON без табличной статистики
Грант Губатан,
5

Немного предыстории: я искал именно этот вопрос, потому что мне нужно было что-то сделать для извлечения контента, но все, что у меня было, - это старая версия python с неадекватной поддержкой SSL. Если вы используете старый MacBook, вы знаете, о чем я говорю. В любом случае, curlработает нормально из оболочки (я подозреваю, что она связана с современной поддержкой SSL), поэтому иногда вы хотите сделать это без использования requestsили urllib2.

Вы можете использовать subprocessмодуль для выполнения curlи получения найденного контента:

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

subprocessМодуль Python 3 также содержит .run()ряд полезных опций. Я оставлю это кому-то, кто на самом деле работает Python 3, чтобы предоставить этот ответ.

joemadeus
источник
-4

Этого можно достичь с помощью нижеприведенного подхода с использованием псевдо-кода

Импорт или импорт запросов Data = os.execute (curl URL) R = Data.json ()

user9761315
источник
os.system вместо os.execute, и запросы в этом случае кажутся ненужными
SeanFromIT