1. ホーム
  2. python

[解決済み] Pythonスクリプトでcurlコマンドを実行する

2023-02-08 05:23:31

質問

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

で、うまくいくのですが、もっといい方法はないでしょうか?

どのように解決するのですか?

やめてください

誰も望んでいない答えなのは分かっています。しかし、もし何かやる価値があるのなら それは正しく行う価値があります。 ですよね?

この良いアイデアのように見えるのは、おそらく、以下のようなシェルコマンドがかなり広く誤解されていることに起因しています。 curl などのシェルコマンドは、プログラムそのもの以外の何ものでもないという、かなり広い誤解からきているのでしょう。

つまり、あなたが求めているのは、「自分のプログラムの中から、ほんのちょっとのWebリクエストをするために、どうやって他のプログラムを実行すればいいのか?それはおかしい、もっと良い方法があるはずでしょう?

Uxioの回答 は確かに機能します。しかし、それはほとんど非常に Pythonic には見えませんよね?一つの小さな要求のために多くの作業をしなければならないのです。Pythonは本来 フライング ! これを書いている人は、おそらく、ただ call 'd curl !


うまくいくのですが、もっといい方法はないでしょうか?

はい、あります。 はあります。 より良い方法があります!

リクエスト HTTP for Humans

<ブロッククオート

物事はこのようにあるべきではありません。Pythonではありません。

このページをGETしてみましょう。

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

これで終わりです。次に、生の res.text または res.json() の出力では res.headers など。

すべてのオプションの設定の詳細については、docs (上記リンク) を参照してください。

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

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

GET リクエストのクエリ文字列を指定するために、Python の素敵なディクショナリーを使うこともできます。 params={} .

シンプルでエレガント。落ち着いて、飛び続けましょう。