Pythonを使用してcurlコマンドを実行する方法


171

Pythonでcurlコマンドを実行したいのですが。

通常、ターミナルにコマンドを入力してReturnキーを押すだけです。しかし、私はそれがpythonでどのように機能するのか知りません。

コマンドは以下のとおりです。

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 2014


1
FWIW、curlへPythonバインディング」のpycurlの使用を検討しましたか?ニーズによっては、背後でコマンドラインユーティリティを呼び出すよりも効率的で便利な場合があります。
Sylvain Leroux、2014

3
cURLを使用する必要がありますか?リクエストを検討しましたか?特に、Pythonを初めて使用する場合は、許されがたい傾向があるため、より単純になる可能性があります。
vch 2014

3
うーんpythonはかなり寛大です....多分カールしない
Joran Beasley 14

回答:


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 2015

4
他の誰かがこれを偶然目にした場合、それが私に起こったのは、ディクショナリオブジェクトではなく文字列をペイロードとして与えていたからです。
トリックノロジー2015

1
ヘッダーに小さなタイプミスがあるようです。読むべきです'Accept-Charset': 'UTF-8'
スティーブンリード

1
送信する前にファイルを開いてJSONを解析することは、不必要に非効率的です。JSONを解析してから、json.dumps()を使用して文字列に変換します。これは悪い答えです。
Nathan K

4
Requestsインストールと管理に必要な追加の依存関係です。標準ライブラリのみを使用した簡単なソリューションについては、stackoverflow.com
a / 13921930/111995

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(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 Beasley 14

一つの小さなノートでは、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

そのPythonの実装は次のようになります

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

必要なパラメータを提供していないことをお詫び申し上げます。


--resolveのようなcurlからいくつかの特別なオプションを使用する必要がある場合は、これが方法です。ありがとうございました。
nikoskip

表形式の統計なしで返されたjsonのみを取得する方法
Grant Gubatan 2018年

5

背景:コンテンツを取得するために何かをしなければならなかったので、まさにこの質問を探しに行きましたが、入手できたのは、SSLサポートが不十分な古いバージョンのpythonだけでした。古い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])

Python 3のsubprocessモジュールに.run()は、いくつかの便利なオプションも含まれています。その答えを提供するために実際にpython 3を実行している人に任せます。


-4

これは、下記の擬似コードアプローチで実現できます。

インポートosインポートリクエストデータ= os.execute(curl URL)R = Data.json()


os.executeではなくos.system、この場合リクエストは不要のようです
SeanFromIT
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.