cara menggunakan python untuk menjalankan perintah curl

171

Saya ingin menjalankan perintah curl dengan python.

Biasanya, saya hanya perlu memasukkan perintah di terminal dan tekan tombol kembali. Namun, saya tidak tahu cara kerjanya di python.

Perintah ini menunjukkan di bawah ini:

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

Ada file request.json yang akan dikirim untuk mendapatkan respons.

Saya banyak mencari dan bingung. Saya mencoba menulis sepotong kode, walaupun saya tidak dapat sepenuhnya mengerti. Itu tidak berhasil.

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

Pesan kesalahannya adalah 'Parse Error'.Bisakah ada yang memberi tahu saya cara memperbaikinya? atau bagaimana mendapatkan respons dari server dengan benar?

Qiang Fu
sumber
1
Bisakah Anda memasukkan Traceback dari kesalahan?
shaktimaan
1
FWIW, sudahkah Anda mempertimbangkan menggunakan pycurl sebagai "Python binding to cURL" ? Tergantung kebutuhan Anda, mungkin lebih efisien / nyaman daripada menggunakan utilitas baris perintah di belakang layar.
Sylvain Leroux
3
Apakah Anda perlu menggunakan CURL? Sudahkah Anda mempertimbangkan Permintaan ? Mungkin lebih sederhana, terutama jika Anda baru mengenal python, yang cenderung tidak termaafkan.
vch
3
ummm python cukup memaafkan .... mungkin tidak meringkuk
Joran Beasley

Jawaban:

191

Demi kesederhanaan, mungkin Anda harus mempertimbangkan untuk menggunakan perpustakaan Permintaan .

Contoh dengan konten respons json akan seperti:

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

Jika Anda mencari informasi lebih lanjut, di bagian Quickstart , mereka memiliki banyak contoh yang berfungsi.

EDIT:

Untuk terjemahan ikal spesifik Anda:

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
sumber
1
Tolong @teknologi, coba cari bug dan, jika Anda tidak menemukan solusi yang tepat, kirimkan pertanyaan baru.
otorrillas
4
Jika ada orang lain yang melihat ini, alasan mengapa hal itu terjadi pada saya adalah karena saya memberikan string sebagai muatan saya alih-alih objek kamus.
tricknology
1
Tampaknya ada kesalahan ketik kecil di header, yang seharusnya dibaca'Accept-Charset': 'UTF-8'
Stephen Lead
1
Membuka file dan mem-parsing JSON sebelum mengirimnya tidak efisien. Anda menguraikan JSON kemudian mengubahnya kembali menjadi string dengan json.dumps (). Ini jawaban yang buruk.
Nathan K
4
Requestsadalah ketergantungan tambahan yang Anda perlukan untuk menginstal dan mengelola. Untuk solusi sederhana menggunakan perpustakaan standar saja, lihat stackoverflow.com/a/13921930/111995
geekQ
94

Cukup gunakan situs web ini . Ini akan mengubah perintah curl menjadi Python, Node.js, PHP, R, atau Go.

Contoh:

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

Menjadi ini dengan 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
sumber
3
Untuk memastikan JSON Anda diformat dengan benar, impor modul "json" dan gunakan json.dumps (payload) pada data payload yaitu data = json.dumps (data) dalam kasus di atas
Richard Bown
23
import requests
url = "https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere"
data = requests.get(url).json

mungkin?

jika Anda mencoba mengirim file

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

ahh terima kasih @LukasGraf sekarang saya lebih mengerti apa yang dilakukan kode aslinya

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
sumber
Itu tidak termasuk data dari requests.jsonfile, dan tidak mengatur Content-Type: application/jsonheader - juga, ini akan mengirim GETpermintaan, bukan a POST.
Lukas Graf
1
curl -d @<file>akan membaca bidang yang akan dikirimi <file>- itu tidak sama dengan unggahan file.
Lukas Graf
@LukasGraf terima kasih :) ... Saya tidak banyak menggunakan curl (baca: hampir tidak pernah)
Joran Beasley
Satu catatan kecil, data = requests.get(url).jsonharusdata = requests.get(url).json()
dpg5000
pada tahun 2014 itu adalah properti sekarang fungsinya :) panggilan yang bagus
Joran Beasley
19
curl -d @request.json --header "Content-Type: application/json" https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere

implementasi python-nya seperti

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)

periksa tautan ini , ini akan membantu mengubah perintah cURl ke python, php dan nodejs

cryptoKTM
sumber
8

Jawaban saya adalah 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

Saya minta maaf karena tidak memberikan parameter yang diperlukan karena itu rahasia.

apoorva_bhat
sumber
Jika Anda perlu menggunakan beberapa opsi spesial dari curl seperti --resolve inilah caranya. Terima kasih.
nikoskip
bagaimana saya hanya bisa mendapatkan json yang dikembalikan tanpa stat tabel
Grant Gubatan
5

Beberapa latar belakang: Saya mencari pertanyaan ini karena saya harus melakukan sesuatu untuk mengambil konten, tetapi yang saya miliki hanyalah versi python lama dengan dukungan SSL yang tidak memadai. Jika Anda menggunakan MacBook lama, Anda tahu apa yang saya bicarakan. Bagaimanapun, curlberjalan dengan baik dari shell (saya kira itu memiliki dukungan SSL modern yang terhubung) jadi kadang-kadang Anda ingin melakukan ini tanpa menggunakan requestsatau urllib2.

Anda dapat menggunakan subprocessmodul untuk mengeksekusi curldan mendapatkan konten yang diambil:

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

subprocessModul Python 3 juga berisi .run()sejumlah opsi yang bermanfaat. Saya akan menyerahkannya kepada seseorang yang benar-benar menjalankan python 3 untuk memberikan jawaban itu.

joemadeus
sumber
-4

Ini dapat dicapai dengan pendekatan kode psuedo yang disebutkan di bawah ini

Impor atau impor permintaan Data = os.execute (URL curl) R = Data.json ()

pengguna9761315
sumber
os.sistem alih-alih os.execute, dan permintaan tampaknya tidak perlu dalam kasus ini
SeanFromIT