एक कर्ल कमांड को निष्पादित करने के लिए अजगर का उपयोग कैसे करें


171

मैं अजगर में एक कर्ल कमांड निष्पादित करना चाहता हूं।

आमतौर पर, मुझे टर्मिनल में कमांड दर्ज करने और रिटर्न कुंजी दबाने की आवश्यकता होती है। हालाँकि, मुझे नहीं पता कि यह अजगर में कैसे काम करता है।

आदेश नीचे दिखाया गया है:

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
क्या आप त्रुटि का ट्रेसबैक शामिल कर सकते हैं?
शकीतिमान

क्या यह मदद करता है? stackoverflow.com/questions/2667509/curl-alternative-in-python
br3w5

1
FWIW, क्या आपने pycurl का उपयोग कर " पायल बाइंडिंग टू सर्ल " माना है ? आपकी आवश्यकताओं के आधार पर, यह दृश्य के पीछे कमांड लाइन उपयोगिता को लागू करने की तुलना में अधिक कुशल / सुविधाजनक हो सकता है।
सिल्वेन लेरॉक्स

3
क्या आपको CURL का उपयोग करने की आवश्यकता है? क्या आपने अनुरोधों पर विचार किया है ? सरल हो सकता है, खासकर यदि आप अजगर के लिए नए हैं, जो माफ करना है।
vch

3
उम्म अजगर बहुत क्षमाशील है .... शायद कर्ल नहीं है
जोरन बेज़ले

जवाबों:


191

सादगी के लिए, शायद आपको अनुरोध पुस्तकालय का उपयोग करने पर विचार करना चाहिए ।

Json प्रतिक्रिया सामग्री के साथ एक उदाहरण कुछ इस तरह होगा:

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

यदि आप आगे की जानकारी की तलाश में, क्विकस्टार्ट में सेक्शन में देखें, तो उनके पास काम करने के बहुत सारे उदाहरण हैं।

संपादित करें:

आपके विशिष्ट कर्ल अनुवाद के लिए:

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'
स्टीफन लीड

1
फ़ाइल को खोलना और JSON भेजने से पहले उसे अनावश्यक रूप से अक्षम करना। आप JSON को पार्स करते हैं और फिर इसे json.dumps () के साथ एक स्ट्रिंग में बदल देते हैं। यह एक बुरा जवाब है।
नाथन के

4
Requestsएक अतिरिक्त निर्भरता है जिसे आपको स्थापित करने और प्रबंधित करने की आवश्यकता है। बस मानक पुस्तकालय का उपयोग कर एक सरल समाधान के लिए, stackoverflow.com/a/13921930/111995
geekQ

93

बस इस वेबसाइट का उपयोग करें । यह पायथन, Node.js, PHP, R, या Go में किसी भी कर्ल कमांड को परिवर्तित करेगा।

उदाहरण:

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

अजगर में यह बन जाता है,

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 (पेलोड) का उपयोग करें अर्थात उपरोक्त मामले में डेटा = 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 धन्यवाद :) ... मैं उपयोग कर्ल ज्यादा (पढ़ें: लगभग कभी नहीं) न
Joran बीस्ले

एक छोटा नोट, 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

इसका अजगर कार्यान्वयन जैसा है

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 कमांड को अजगर, php और नोडज में बदलने में मदद करेगा


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

मैं आवश्यक पैरामीटर प्रदान करने के लिए माफी माँगता हूँ 'coz यह गोपनीय है।


यदि आपको कर्ल से कुछ विशेष विकल्पों का उपयोग करने की आवश्यकता है जैसे - समाधान यह तरीका है। धन्यवाद।
निकोसिप

मैं केवल सारणीबद्ध
मूर्ति के

5

कुछ पृष्ठभूमि: मैं वास्तव में इस सवाल की तलाश में था क्योंकि मुझे सामग्री को पुनः प्राप्त करने के लिए कुछ करना था, लेकिन मेरे पास जो भी उपलब्ध था वह अपर्याप्त एसएसएल समर्थन के साथ अजगर का एक पुराना संस्करण था। यदि आप एक पुराने मैकबुक पर हैं, तो आप जानते हैं कि मैं किस बारे में बात कर रहा हूं। किसी भी मामले में, curlएक शेल से ठीक चलता है (मुझे संदेह है कि इसमें आधुनिक एसएसएल समर्थन जुड़ा हुआ है) इसलिए कभी-कभी आप यह उपयोग 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])

पायथन 3 के subprocessमॉड्यूल में .run()कई उपयोगी विकल्प भी हैं। मैं इसे किसी ऐसे व्यक्ति के पास छोड़ दूँगा जो वास्तव में उस उत्तर को प्रदान करने के लिए अजगर 3 चला रहा है।


-4

यह नीचे उल्लिखित psuedo कोड दृष्टिकोण के साथ प्राप्त किया जा सकता है

आयात os आयात अनुरोध डेटा = os.execute (कर्ल URL) R = Data.json ()


os.execute के बजाय os.system, और अनुरोध इस मामले में अनावश्यक लगता है
SeanFromIT
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.