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'
])
そしてそれは動作しますが、より良い方法はありますか?
@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()
誰も望んでいない「答え」だと思います。しかし、何かする価値がある場合、正しいことを行う価値があります?
これはおそらく、curl
などのシェルコマンドがプログラム自体以外のものであるというかなり広い誤解から生じていると考えられます。
したがって、あなたが求めているのは、「わずかなWebリクエストを行うためだけに、このプログラム内からこの他のプログラムをどのように実行するのですか?」です。それはクレイジーです、もっと良い方法が必要ですよね?
xioの答え 動作します。しかし、それはほとんど見えませんPythonic、そうですか?ちょっとしたリクエストだけでも、それは大変な作業です。 Pythonは flying !おそらくcall
'' d curl
!だけを望んでいる執筆者
それは動作しますが、より良い方法はありますか?
物事はこのようであってはなりません。 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={}
を指定することもできます。
シンプルでエレガント。落ち着いて、飛ぶ。
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()
この 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)
Cmd.split()を使用する代わりに、この投稿の回答の1つを言い換えます。使用してみてください:
import shlex
args = shlex.split(cmd)
次に、argsをsubprocess.Popenにフィードします。
詳細については、このドキュメントを確認してください: https://docs.python.org/2/library/subprocess.html#popen-constructor