파이썬을 사용하여 curl 명령을 실행하는 방법


171

파이썬에서 curl 명령을 실행하고 싶습니다.

일반적으로 터미널에 명령을 입력하고 Enter 키를 누르면됩니다. 그러나 파이썬에서 어떻게 작동하는지 모르겠습니다.

명령은 다음과 같습니다.

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
오류 추적을 포함시킬 수 있습니까?
shaktimaan


1
FWIW, pycurl"Python binding to cURL"로 간주 했습니까? 필요에 따라 뒤에서 명령 행 유틸리티를 호출하는 것보다 더 효율적이고 편리 할 수 ​​있습니다.
Sylvain Leroux

3
cURL을 사용해야합니까? 요청 을 고려 했습니까 ? 특히 파이썬을 처음 접하는 경우 더 간단 할 수 있습니다.
vch

3
음, 파이썬은 꽤 용서합니다 .... 어쩌면 컬하지 않습니다
Joran Beasley

답변:


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
다른 사람이 이것을 보았을 때, 그 일이 일어난 이유는 사전 객체 대신 페이로드로 문자열을 제공했기 때문입니다.
tricknology

1
헤더에 작은 오타가있는 것 같습니다.'Accept-Charset': 'UTF-8'
Stephen Lead

1
파일을 열고 JSON을 파싱하기 전에 파싱하는 것은 불필요하게 비효율적입니다. JSON을 구문 분석 한 다음 json.dumps ()를 사용하여 다시 문자열로 변환하십시오. 이것은 나쁜 대답입니다.
Nathan 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

파이썬에서 이것이됩니다.

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 (payload)를 사용하십시오 (예 : 위의 경우 data = json.dumps (data)
Richard Bown

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 감사합니다 :) ... 나는 많은 (읽을 : 거의 절대) 사용 컬을 해달라고
Joran 비즐리에게

하나의 작은 노트는 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

필요한 매개 변수를 제공하지 않아서 죄송합니다.


curl과 같은 특수 옵션을 사용해야하는 경우 --resolve가 방법입니다. 감사합니다.
nikoskip

난 단지 표 합계없이 반환 된 JSON 얻을 수있는 방법
그랜트 Gubatan

5

일부 배경 : 내용을 검색하기 위해 무언가를해야했기 때문에이 질문을 정확하게 찾아 갔지만 SSL 지원이 부적절한 이전 버전의 Python 만 사용할 수있었습니다. 구형 MacBook을 사용하고 있다면 내가 말하는 것을 알고 있습니다. 어쨌든 curl셸에서 잘 실행되므로 (현대 SSL 지원이 연결되어 있다고 생각합니다) 때로는 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])

Python 3의 subprocess모듈에는 .run()여러 유용한 옵션이 포함되어 있습니다. 실제로 파이썬 3을 실행하는 사람에게 그 대답을 제공하도록 남겨 두겠습니다.


-4

이것은 아래 언급 된 의사 코드 접근 방식으로 달성 할 수 있습니다

가져 오기 os 가져 오기 요청 Data = os.execute (curl URL) R = Data.json ()


os.execute 대신 os.system이며이 경우 요청이 불필요 해 보입니다.
SeanFromIT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.