Execute curl command within a Python script

Execute curl command within a Python script

Dont!

I know, thats the answer nobody wants. But if somethings worth doing, its worth doing right, right?

This seeming like a good idea probably stems from a fairly wide misconception that shell commands such as curl are anything other than programs themselves.

So what youre asking is how do I run this other program, from within my program, just to make a measly little web request?. Thats crazy, theres got to be a better way right?

Uxios answer works, sure. But it hardly looks very Pythonic, does it? Thats a lot of work just for one little request. Pythons supposed to be about flying! Anyone writing that is probably wishing they just calld curl!


it works, but is there a better way?

Yes, there is a better way!

Requests: HTTP for Humans

Things shouldn’t be this way. Not in Python.

Lets GET this page:

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

Thats it, really! You then have the raw res.text, or res.json() output, the res.headers, etc.

You can see the docs (linked above) for details of setting all the options, since I imagine OP has moved on by now, and you – the reader now – likely need different ones.

But, for example, its as simple as:

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

You can even use a nice Python dict to supply the query string in a GET request with params={}.

Simple and elegant. Keep calm, and fly on.

You could use urllib as @roippi said:

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()

Execute curl command within a Python script

Use this tool (hosted here for free) to convert your curl command to equivalent Python requests code:

Example: This,

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

Gets converted neatly to:

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)

Leave a Reply

Your email address will not be published. Required fields are marked *