як використовувати 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()

Повідомлення про помилку - "Помилка розбору". Чи хтось скаже мені, як це виправити? або як правильно отримати відповідь від серйозних?


1
Чи можете ви включити відстеження помилки?
shaktimaan


1
FWIW, ви розглянули з використанням pycurl в «Python прив'язки до скручування» ? Залежно від ваших потреб, це може бути ефективніше / зручніше, ніж виклик утиліти командного рядка поза сценою.
Сільвен Леру

3
Чи потрібно використовувати CURL? Чи розглядали Ви запити ? Можливо, це буде простіше, особливо якщо ви новачок у пітоні, який, як правило, непереборний.
vch

3
ummm python - це досить прощає .... можливо, не згортається
Joran Beasley,

Відповіді:


191

Для простоти, можливо, вам варто розглянути можливість використання бібліотеки " Запити" .

Приклад із вмістом відповіді json може бути приблизно таким:

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

Якщо ви шукаєте додаткову інформацію, у розділі Quickstart вони мають багато робочих прикладів.

Редагувати:

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

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)

1
Будь ласка, @tricknology, спробуйте знайти помилку, і якщо у вас не трапиться знайти правильне рішення, опублікуйте нове запитання.
otorrillas

4
Якщо хто-небудь ще трапляється бачити це, причиною того, що зі мною відбувалося, є те, що я давав рядок як мій корисний вантаж замість словника.
хитрологія

1
Здається, в заголовках є невеликий помилок, який слід читати'Accept-Charset': 'UTF-8'
Stephen Lead

1
Відкриття файлу та аналіз JSON перед його надсиланням зайве неефективно. Ви розбираєте JSON, а потім перетворюєте його назад у рядок з json.dumps (). Це погана відповідь.
Натан К

4
Requests- це додаткова залежність, яку потрібно встановити та керувати. Для простого рішення , використовуючи тільки стандартну бібліотеку, см stackoverflow.com/a/13921930/111995
geekQ

93

Просто використовуйте цей веб-сайт . Він перетворить будь-яку команду 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 (дані) у наведеному вище випадку
Річард Боун

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 дякую :) ... Я не використовую curl сильно (читати: майже ніколи)
Joran Beasley

Одна невеличка записка, data = requests.get(url).jsonповинна бутиdata = requests.get(url).json()
dpg5000

у 2014 році це було майно, тепер його функція :) Хоча гарний дзвінок
Джоран Біслі,

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


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

Прошу вибачення за те, що не надаю потрібні параметри, оскільки це конфіденційно.


Якщо вам потрібно скористатися деякими спеціальними параметрами від curl на зразок --resolve, це шлях. Дякую.
nikoskip

як я можу отримати лише повернутий 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, щоб надати відповідь.


-4

Цього можна досягти за допомогою наведеного нижче кодового підходу psuedo

Імпорт os запитів на імпорт Data = os.execute (URL-адреса curl) R = Data.json ()


os.system замість os.execute, і запити в цьому випадку видаються непотрібними
SeanFromIT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.