python执行curl_在Python脚本中执行curl命令

景哲
2023-12-01

在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'

])

可以,但是还有更好的方法吗?

5个解决方案

143 votes

别!

我知道,这就是没人想要的“答案”。 但是,如果有值得做的事情,那就值得做对,对吧?

这似乎是一个好主意,这可能是由于人们产生了很大的误解,即诸如params={}之类的shell命令不是程序本身就是其他任何东西。

因此,您要问的是“我如何从我的程序中运行另一个程序,只是发出很少的Web请求?”。 太疯狂了,必须有更好的方法吧?

当然,Uxio的答案有效。 但这看起来很难像Python一样,对吗? 仅需一个小请求,这就是很多工作。 Python应该飞了! 任何可能希望他们只是params={}和res.json()的人都在写!

它有效,但是有更好的方法吗?

是的,有更好的方法!

请求:HTTP for Humans

事情不应该这样。 不在Python中。

让我们获取此页面:

import requests

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

就是这样,真的! 然后,您将获得原始的params={}或res.json()输出,res.headers等。

您可以查看文档(上方链接)以获取有关设置所有选项的详细信息,因为我认为OP现已发展,您-现在的读者-可能需要其他选项。

但是,例如,它很简单:

url = 'http://example.tld'

payload = { 'key' : 'val' }

headers = {}

res = requests.post(url, data=payload, headers=headers)

您甚至可以使用一个不错的Python字典在params={}的GET请求中提供查询字符串。

简洁大方。 保持冷静,然后继续前进。

OJFord answered 2020-01-20T00:44:42Z

33 votes

您可以像@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()

Uxio answered 2020-01-20T00:43:20Z

23 votes

如果您没有过多地调整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()

hyades answered 2020-01-20T00:45:02Z

10 votes

使用此工具(免费托管在此处)将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)

Nitin Nain answered 2020-01-20T00:45:31Z

0 votes

改写这篇文章中的答案之一,而不是使用cmd.split()。 尝试使用:

import shlex

args = shlex.split(cmd)

然后将args送入subprocess.Popen。

检查此文档以获取更多信息:[https://docs.python.org/2/library/subprocess.html#popen-constructor]

Ganesh prasad answered 2020-01-20T00:46:00Z

 类似资料: