web-dev-qa-db-ja.com

Pythonスクリプト内でcurlコマンドを実行します

pythonスクリプト内でcurlコマンドを実行しようとしています。

ターミナルで実行すると、次のようになります。

curl -X POST -d  '{"nw_src": "10.0.0.1/32", "nw_dst": "10.0.0.2/32", "nw_proto": "ICMP", "actions": "ALLOW", "priority": "10"}' http://localhost:8080/firewall/rules/0000000000000001

pycurlを使用する推奨事項を見てきましたが、それを自分に適用する方法がわかりませんでした。

私は使用してみました:

subprocess.call([
    'curl',
    '-X',
    'POST',
    '-d',
    flow_x,
    'http://localhost:8080/firewall/rules/0000000000000001'
])

そしてそれは動作しますが、より良い方法はありますか?

49
Kiran Vemuri

@roippiが言ったように、urllibを使用できます。

import urllib2
data = '{"nw_src": "10.0.0.1/32", "nw_dst": "10.0.0.2/32", "nw_proto": "ICMP", "actions": "ALLOW", "priority": "10"}'
url = 'http://localhost:8080/firewall/rules/0000000000000001'
req = urllib2.Request(url, data, {'Content-Type': 'application/json'})
f = urllib2.urlopen(req)
for x in f:
    print(x)
f.close()
33
Uxio

しないでください!

誰も望んでいない「答え」だと思います。しかし、何かする価値がある場合、正しいことを行う価値があります

これはおそらく、curlなどのシェルコマンドがプログラム自体以外のものであるというかなり広い誤解から生じていると考えられます。

したがって、あなたが求めているのは、「わずかなWebリクエストを行うためだけに、このプログラム内からこの他のプログラムをどのように実行するのですか?」です。それはクレイジーです、もっと良い方法が必要ですよね?

xioの答え 動作します。しかし、それはほとんど見えませんPythonic、そうですか?ちょっとしたリクエストだけでも、それは大変な作業です。 Pythonは flying !おそらくcall '' d curl!だけを望んでいる執筆者


それは動作しますが、より良い方法はありますか?

はい、ありますisより良い方法です!

リクエスト:人間のためのHTTP

物事はこのようであってはなりません。 Pythonではありません。

このページをGETしましょう:

import requests
res = requests.get('https://stackoverflow.com/questions/26000336')

それだけです!その後、生のres.text、またはres.json()出力、res.headersなどが得られます。

すべてのオプションの設定の詳細については、ドキュメント(上記のリンクを参照)を参照してください。OPはこれまでに移行しており、読者の皆さんは別のオプションが必要になる可能性が高いと思います。

ただし、たとえば、次のように簡単です。

url     = 'http://example.tld'
payload = { 'key' : 'val' }
headers = {}
res = requests.post(url, data=payload, headers=headers)

Nice Python dictを使用して、GET要求でクエリ文字列にparams={}を指定することもできます。

シンプルでエレガント。落ち着いて、飛ぶ。

142
OJFord

Curlコマンドを微調整していない場合は、curlコマンドを直接呼び出すこともできます

import shlex
cmd = '''curl -X POST -d  '{"nw_src": "10.0.0.1/32", "nw_dst": "10.0.0.2/32", "nw_proto": "ICMP", "actions": "ALLOW", "priority": "10"}' http://localhost:8080/firewall/rules/0000000000000001'''
args = shlex.split(cmd)
process = subprocess.Popen(args, Shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
22
hyades

この tool (hosted here 無料)を使用して、curlコマンドを同等のPython要求コードに変換します。

例:これ、

curl 'https://www.example.com/' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' -H 'Origin: https://www.example.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Cookie: SESSID=ABCDEF' --data-binary 'Pathfinder' --compressed

きれいに変換されます:

import requests

cookies = {
    'SESSID': 'ABCDEF',
}

headers = {
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
    'Origin': 'https://www.example.com',
    'Accept-Encoding': 'gzip, deflate, br',
}

data = 'Pathfinder'

response = requests.post('https://www.example.com/', headers=headers, cookies=cookies, data=data)
8
Nitin Nain

Cmd.split()を使用する代わりに、この投稿の回答の1つを言い換えます。使用してみてください:

import shlex

args = shlex.split(cmd)

次に、argsをsubprocess.Popenにフィードします。

詳細については、このドキュメントを確認してください: https://docs.python.org/2/library/subprocess.html#popen-constructor

0
Ganesh prasad