bir kıvırma komutu yürütmek için python nasıl kullanılır


171

Python'da bir kıvırma komutu yürütmek istiyorum.

Genellikle, sadece komutu terminalde girmem ve dönüş tuşuna basmam gerekir. Ancak, python'da nasıl çalıştığını bilmiyorum.

Komut aşağıda gösterilmiştir:

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

Yanıt almak için gönderilecek bir request.json dosyası var.

Çok araştırdım ve kafam karıştı. Ben tam olarak anlayamadım rağmen, bir kod parçası yazmaya çalıştım. İşe yaramadı.

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

Hata mesajı 'Ayrıştırma Hatası'. Herkes bana nasıl düzeltileceğini söyleyebilir mi? veya sunucudan doğru cevap nasıl alınır?


1
Hatanın Geri İzlemesini ekleyebilir misiniz?
shaktimaan


1
FWIW, kullandığınız kabul sahip pycurl "cURL bağlanarak Python" ? İhtiyaçlarınıza bağlı olarak, sahnenin arkasındaki komut satırı yardımcı programını çağırmaktan daha verimli / kullanışlı olabilir.
Sylvain Leroux

3
CURL kullanmanız gerekiyor mu? İstekleri düşündünüz mü ? Özellikle python'da yeniyseniz, affetmez olma eğiliminde olan daha basit olabilir.
vch

3
ummm python oldukça bağışlayıcıdır .... belki kıvırmak değil
Joran Beasley

Yanıtlar:


191

Kolaylık olması için, belki de İstekler kütüphanesini kullanmayı düşünmelisiniz .

Json yanıt içeriğine sahip bir örnek şuna benzer:

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

Daha fazla bilgi arıyorsanız, Hızlı Başlangıç bölümünde çok sayıda çalışma örneği vardır.

DÜZENLE:

Özel kıvırma çeviriniz için:

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
Lütfen @ teknoloji, hatayı aramaya çalışın ve uygun bir çözüm bulamazsanız, yeni bir soru gönderin.
otorrillas

4
Başkasının bunu görmesi durumunda, bunun bana olmasının nedeni, bir sözlük nesnesi yerine yüküm olarak bir dize vermemdi.
tricknology

1
Görünüşe göre başlıklarda küçük bir yazım hatası var'Accept-Charset': 'UTF-8'
Stephen Lead

1
Dosyayı açmak ve göndermeden önce JSON'u ayrıştırmak gereksiz yere verimsizdir. JSON ayrıştırdıktan sonra geri json.dumps () ile bir dizeye dönüştürmek. Bu kötü bir cevap.
Nathan K

4
Requestsyüklemeniz ve yönetmeniz gereken ekstra bir bağımlılıktır. Yalnızca standart kitaplığı kullanarak basit bir çözüm için bkz. Stackoverflow.com/a/13921930/111995
geekQ

95

Sadece bu web sitesini kullanın . Herhangi bir curl komutunu Python, Node.js, PHP, R veya Go'ya dönüştürür.

Misal:

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

Python'da bu olur,

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'unuzun doğru biçimlendirildiğinden emin olmak için "json" modülünü içe aktarın ve veri yükünde json.dumps (faydalı yük) kullanın, yani yukarıdaki durumda data = json.dumps (veri)
Richard Bown

23
import requests
url = "https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere"
data = requests.get(url).json

olabilir?

bir dosya göndermeye çalışıyorsanız

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

ahh teşekkürler @LukasGraf şimdi orijinal kodunun ne yaptığını daha iyi anlıyorum

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? 

Bu, requests.jsondosyadaki verileri içermez ve Content-Type: application/jsonüstbilgiyi ayarlamaz - ayrıca bu bir GETistek değil, bir istek gönderir POST.
Lukas Graf

1
curl -d @<file>gönderilecek alanları okuyacaktır <file>- bu, dosya yüklemeyle aynı değildir.
Lukas Graf

@LukasGraf teşekkürler :) ... Kıvırmayı çok kullanmıyorum (okuma: neredeyse hiç)
Joran Beasley

Bir küçük not, data = requests.get(url).jsonolmalıdırdata = requests.get(url).json()
dpg5000

2014 yılında bir özellik oldu şimdi onun bir işlevi :) iyi çağrı olsa
Joran Beasley

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

onun python uygulaması gibi

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)

Bu bağlantıyı kontrol edin , cURl komutunu python, php ve nodejs'e dönüştürmeye yardımcı olacaktır


8

Cevabım 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

Gerekli parametrelerin gizli kalmaması nedeniyle özür dilerim.


Kıvrımdan bazı özel seçenekler kullanmanız gerekiyorsa --resolve bu yol. Teşekkür ederim.
nikoskip

nasıl sadece
tablodaki

5

Bazı arka plan: Tam olarak bu soruyu aramaya gittim çünkü içeriği almak için bir şeyler yapmak zorunda kaldım, ancak elimde olan tek şey yetersiz SSL desteği olan eski bir python sürümü idi. Eski bir MacBook kullanıyorsanız, neden bahsettiğimi biliyorsunuz. Her durumda, curlbir kabuktan iyi çalışır (bağlı modern SSL desteğine sahip olduğundan şüpheleniyorum) bu yüzden bazen requestsveya kullanmadan bunu yapmak istersiniz urllib2.

Alınan içeriği subprocessyürütmek curlve içeriğe erişmek için modülü kullanabilirsiniz :

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

Python 3'ün subprocessmodülü de .run()bir dizi kullanışlı seçenek içerir. Bu cevabı vermek için aslında python 3 çalıştıran birine bırakacağım.


-4

Bu, aşağıda belirtilen psuedo kodu yaklaşımıyla başarılabilir.

Alma os alma istekleri Veri = os.execute (kıvrılma URL'si) R = Data.json ()


os.execute yerine os.system ve istekler bu durumda gereksiz görünüyor
SeanFromIT
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.