Làm thế nào để sử dụng python để thực hiện một lệnh curl


171

Tôi muốn thực thi một lệnh curl trong python.

Thông thường, tôi chỉ cần nhập lệnh trong terminal và nhấn phím return. Tuy nhiên, tôi không biết làm thế nào nó hoạt động trong python.

Lệnh hiển thị dưới đây:

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

Có một tệp request.json được gửi để nhận phản hồi.

Tôi đã tìm kiếm rất nhiều và bị nhầm lẫn. Tôi đã cố viết một đoạn mã, mặc dù tôi không thể hiểu hết. Nó không hoạt động.

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

Thông báo lỗi là 'Lỗi phân tích'. Có ai cho tôi biết cách khắc phục không? hoặc làm thế nào để có được phản hồi từ sever một cách chính xác?


1
Bạn có thể bao gồm Trac trở lại của lỗi?
shaktimaan


1
FWIW, có bạn xem là sử dụng pycurl các "Python ràng buộc để cURL" ? Tùy thuộc vào nhu cầu của bạn, nó có thể hiệu quả / thuận tiện hơn so với việc gọi tiện ích dòng lệnh phía sau hiện trường.
Sylvain Leroux

3
Bạn có cần sử dụng cURL? Bạn đã xem xét Yêu cầu ? Có thể đơn giản hơn, đặc biệt nếu bạn chưa quen với python, có xu hướng không tha thứ.
vch

3
Con trăn ummm khá dễ tha thứ .... có thể không cuộn tròn
Joran Beasley

Câu trả lời:


191

Để đơn giản, có lẽ bạn nên cân nhắc sử dụng thư viện Yêu cầu .

Một ví dụ với nội dung phản hồi json sẽ là một cái gì đó như:

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

Nếu bạn tìm kiếm thêm thông tin, trong phần Khởi động nhanh , họ có rất nhiều ví dụ hoạt động.

BIÊN TẬP:

Đối với bản dịch curl cụ thể của bạn:

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
Vui lòng @tricknology, cố gắng tìm kiếm lỗi và nếu bạn không tìm thấy giải pháp thích hợp, hãy đăng câu hỏi mới.
otorrillas

4
Nếu bất cứ ai khác tình cờ thấy điều này, lý do tại sao điều đó xảy ra với tôi là tôi đã đưa ra một chuỗi làm trọng tải của mình thay vì một đối tượng từ điển.
thủ thuật

1
Dường như có một lỗi đánh máy nhỏ trong các tiêu đề, nên đọc'Accept-Charset': 'UTF-8'
Stephen Lead

1
Mở tệp và phân tích cú pháp JSON trước khi gửi nó là không hiệu quả. Bạn phân tích cú pháp JSON sau đó chuyển đổi nó thành một chuỗi với json.dumps (). Đây là một câu trả lời xấu.
Nathan K

4
Requestslà một phụ thuộc thêm mà bạn cần để cài đặt và quản lý. Để biết giải pháp đơn giản chỉ sử dụng thư viện chuẩn, hãy xem stackoverflow.com/a/13921930/111995
geekQ

93

Chỉ cần sử dụng trang web này . Nó sẽ chuyển đổi bất kỳ lệnh curl nào thành Python, Node.js, PHP, R hoặc Go.

Thí dụ:

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

Trở thành cái này trong 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
Để đảm bảo JSON của bạn được định dạng chính xác, hãy nhập mô-đun "json" và sử dụng json.dumps (tải trọng) trên tải trọng dữ liệu tức là data = json.dumps (dữ liệu) trong trường hợp trên
Richard Bown

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

có lẽ?

nếu bạn đang cố gắng gửi một tập tin

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

ahh cảm ơn @LukasGraf bây giờ tôi hiểu rõ hơn mã gốc của anh ấy đang làm gì

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? 

Tuy nhiên, điều đó không bao gồm dữ liệu từ requests.jsontệp và không đặt Content-Type: application/jsontiêu đề - đồng thời, điều này sẽ gửi GETyêu cầu, không phải a POST.
Lukas Graf

1
curl -d @<file>sẽ đọc các trường để đăng từ <file>- không giống như tải lên tệp.
Lukas Graf

@LukasGraf cảm ơn :) ... Tôi không sử dụng curl nhiều (đọc: gần như không bao giờ)
Joran Beasley

Một lưu ý nhỏ, data = requests.get(url).jsonnên làdata = requests.get(url).json()
dpg5000

năm 2014 nó là một tài sản bây giờ là một chức năng :) mặc dù vậy, cuộc gọi tốt
Joran Beasley

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

thực hiện python của nó giống như

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)

kiểm tra liên kết này , nó sẽ giúp chuyển đổi lệnh cURl thành python, php và nodejs


8

Câu trả lời của tôi là 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

Tôi xin lỗi vì đã không cung cấp các thông số cần thiết 'vì nó bảo mật.


Nếu bạn cần sử dụng một số tùy chọn đặc biệt từ curl như - giải quyết thì đây là cách. Cảm ơn bạn.
nikoskip

làm thế nào tôi chỉ có thể nhận được json trả về mà không có chỉ số bảng
Grant Gubatan

5

Một số nền tảng: Tôi đã tìm kiếm chính xác câu hỏi này vì tôi phải làm gì đó để lấy nội dung, nhưng tất cả những gì tôi có là một phiên bản cũ của python với sự hỗ trợ SSL không đầy đủ. Nếu bạn đang dùng MacBook cũ hơn, bạn sẽ biết tôi đang nói về điều gì. Trong mọi trường hợp, curlchạy tốt từ trình bao (tôi nghi ngờ nó có hỗ trợ SSL hiện đại được liên kết) nên đôi khi bạn muốn làm điều này mà không cần sử dụng requestshoặc urllib2.

Bạn có thể sử dụng subprocessmô-đun để thực thi curlvà lấy tại nội dung được truy xuất:

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

subprocessMô-đun của Python 3 cũng chứa .run()một số tùy chọn hữu ích. Tôi sẽ để nó cho một người thực sự đang chạy python 3 để cung cấp câu trả lời đó.


-4

Điều này có thể đạt được với cách tiếp cận mã psuedo được đề cập dưới đây

Nhập yêu cầu nhập os Dữ liệu = os.execute (URL curl) R = Data.json ()


os.system thay vì os.execute và các yêu cầu dường như không cần thiết trong trường hợp này
SeanFromIT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.