Подтвердить что ты не робот

Выполнить команду curl внутри Python script

Я пытаюсь выполнить команду curl внутри python script.

Если я делаю это в терминале, это выглядит так:

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

и он работает, но есть ли лучший способ?

4b9b3361

Ответ 1

Вы можете использовать urllib, как сказал @roippi:

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

Ответ 2

Не

Я знаю, что "ответа" никто не хочет. Но если что-то стоит делать, стоит делать правильно, правильно?

Это кажется хорошей идеей, вероятно, связано с довольно широким заблуждением, что команды оболочки, такие как curl, представляют собой нечто иное, чем сами программы.

Итак, что вы спрашиваете: "Как мне запустить эту другую программу из моей программы, чтобы сделать небольшой сетевой запрос?". Это безумие, должно быть, лучший способ правильно?

Ответ Uxio работает, конечно. Но он вряд ли выглядит очень Pythonic, не так ли? Это много работы только за один маленький запрос. Предполагалось, что Python будет летать! Любой, кто пишет, вероятно, желает, чтобы они просто call 'd curl!


он работает, но есть ли лучший способ?

Да, есть лучший способ!

Запросы: 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)

Вы даже можете использовать хороший Python dict для предоставления строки запроса в запросе GET с помощью params={}.

Простой и элегантный. Сохраняйте спокойствие и летите.

Ответ 3

Если вы не слишком настраиваете команду 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()

Ответ 4

Используйте этот инструмент (размещенный здесь бесплатно), чтобы преобразовать вашу команду 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)

Ответ 5

Перефразируя один из ответов в этом посте, вместо использования cmd.split(). Попробуй использовать:

import shlex

args = shlex.split(cmd)

Затем передайте аргументы подпроцессу. Откройте.

Проверьте этот документ для получения дополнительной информации: https://docs.python.org/2/library/subprocess.html#popen-constructor