วิธีใช้ไพ ธ อนเพื่อรันคำสั่ง curl


171

ฉันต้องการรันคำสั่ง curl ในหลาม

โดยปกติฉันต้องการป้อนคำสั่งในเทอร์มินัลแล้วกดปุ่มย้อนกลับ อย่างไรก็ตามฉันไม่รู้ว่ามันทำงานอย่างไรในหลาม

คำสั่งแสดงด้านล่าง:

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
คุณสามารถรวม Traceback ของข้อผิดพลาดได้หรือไม่?
shaktimaan

สิ่งนี้ช่วยได้ไหม? stackoverflow.com/questions/2667509/curl-alternative-in-python
br3w5

1
FWIW มีคุณพิจารณาใช้pycurl "งูใหญ่ผูกพันกับม้วน" ? ขึ้นอยู่กับความต้องการของคุณมันอาจมีประสิทธิภาพ / สะดวกกว่าเรียกใช้ยูทิลิตีบรรทัดคำสั่งเบื้องหลัง
Sylvain Leroux

3
คุณต้องการใช้ cURL หรือไม่ คุณพิจารณาคำขอแล้วหรือยัง อาจจะง่ายกว่าโดยเฉพาะถ้าคุณยังใหม่กับงูหลามซึ่งมีแนวโน้มว่าจะไม่ให้อภัย
vch

3
ummm python ค่อนข้างให้อภัย .... อาจจะไม่ขด
Joran Beasley

คำตอบ:


191

เพื่อความเรียบง่ายคุณอาจพิจารณาใช้ไลบรารีคำขอ

ตัวอย่างที่มีเนื้อหาตอบสนอง json จะเป็นดังนี้:

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

หากคุณค้นหาข้อมูลเพิ่มเติมในส่วนQuickstartพวกเขามีตัวอย่างการทำงานมากมาย

แก้ไข:

สำหรับการแปล 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)

1
โปรด @tricknology ลองค้นหาข้อผิดพลาดและหากคุณไม่พบวิธีแก้ไขที่เหมาะสมให้โพสต์คำถามใหม่
otorrillas

4
หากมีคนอื่นเห็นสิ่งนี้เหตุผลที่ทำให้ฉันเกิดขึ้นคือฉันให้สตริงเป็นเพย์โหลดแทนที่จะเป็นวัตถุพจนานุกรม
เคล็ดลับ

1
ดูเหมือนว่ามีการพิมพ์ผิดขนาดเล็กในส่วนหัวซึ่งควรอ่าน'Accept-Charset': 'UTF-8'
สตีเฟ่นนำ

1
การเปิดไฟล์และแยก JSON ก่อนที่จะส่งมันไม่มีประสิทธิภาพโดยไม่จำเป็น คุณแยก JSON แล้วแปลงกลับเป็นสตริงด้วย json.dumps () นี่เป็นคำตอบที่ไม่ดี
นาธาน K

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 (น้ำหนักบรรทุก) ในส่วนของข้อมูลข้อมูลเช่นข้อมูล = 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
Lukas Graf

1
curl -d @<file>จะอ่านฟิลด์ที่จะโพสต์<file>- ซึ่งไม่เหมือนกับการอัปโหลดไฟล์
Lukas Graf

@LukasGraf ขอบคุณ :) ... ฉันไม่ได้ใช้ขดมาก (อ่าน: เกือบจะไม่เคย)
27825 Joran Beasley

หนึ่งโน้ตเล็ก ๆ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

การดำเนินการหลามของมันเป็นเหมือน

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

ฉันขอโทษที่ไม่ให้พารามิเตอร์ที่จำเป็น 'เพราะมันเป็นความลับ


หากคุณต้องการใช้ตัวเลือกพิเศษบางอย่างจากขดเช่น - แก้ปัญหานี้เป็นวิธี ขอบคุณ.
nikoskip

ฉันจะได้รับ json ที่ส่งคืนโดยไม่มี
statular tab ได้อย่างไร

5

พื้นหลังบางอย่าง: ฉันไปหาคำถามนี้เพราะฉันต้องทำอะไรบางอย่างเพื่อดึงเนื้อหา แต่ทั้งหมดที่ฉันมีก็คืองูหลามเวอร์ชั่นเก่าที่มีการรองรับ SSL ไม่เพียงพอ หากคุณใช้ MacBook รุ่นเก่าคุณรู้ว่าฉันกำลังพูดถึงอะไร ในกรณีใด ๆcurlทำงานดีจากเปลือก (ผมสงสัยว่ามันมีการสนับสนุน SSL ที่ทันสมัยเชื่อมโยงใน) ดังนั้นบางครั้งคุณต้องการที่จะทำเช่นนี้โดยไม่ต้องใช้หรือrequestsurllib2

คุณสามารถใช้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 ด้านล่าง

คำขอนำเข้าการนำเข้าระบบปฏิบัติการ Data = os.execute (URL URL) R = Data.json ()


os.system แทน os.execute และคำขอไม่จำเป็นในกรณีนี้
SeanFromIT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.