在Python脚本中执行curl命令

在Python脚本中执行curl命令,python,curl,pycurl,Python,Curl,Pycurl,我试图在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的建议,但我不知

我试图在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命令进行过多的调整,也可以直接调用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()

您可以使用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()
不要! 我知道,这是没人想要的“答案”。但如果某件事值得去做,那就值得去做,对吗

这似乎是一个好主意,可能源于一个相当广泛的误解,即shell命令(如
curl
)不是程序本身

所以你要问的是“我如何在我的程序中运行另一个程序,只是为了发出一个微不足道的web请求?”。那太疯狂了,一定有更好的办法,对吧

当然行。但它看起来不太像蟒蛇,是吗?仅仅为了一个小小的请求,就需要做很多工作。蟒蛇应该是关于!任何写这篇文章的人都可能希望他们只是
打电话
'd
curl


这是可行的,但有更好的办法吗

是的,有更好的办法! 事情不应该是这样的。不是用Python

让我们来看看这一页:

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={}
的查询字符串


朴素典雅。保持冷静,继续前进。

重新表述本文中的一个答案,而不是使用cmd.split()。尝试使用:

import shlex

args = shlex.split(cmd)
然后将参数馈送到subprocess.Popen

查看此文档了解更多信息:

使用此(免费托管)将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)
尝试使用子进程

CurlUrl="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"
使用
getstatusoutput
存储结果

status, output = subprocess.getstatusoutput(CurlUrl)

您可以使用下面的代码段

import shlex
import subprocess
import json

def call_curl(curl):
    args = shlex.split(curl)
    process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = process.communicate()
    return json.loads(stdout.decode('utf-8'))


if __name__ == '__main__':
    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 '''
    output = call_curl(curl)
    print(output)

您不必使用
cURL
将内容发布到服务器<代码>请求
可以很容易地完成(就像可以更努力地检查urllib
一样)检查此项以了解更多关于在python中执行shell cmds的信息谢谢,我使用subprocess.call()实现了它@Ollie Ford的建议对我帮助很大:我已经在W10下安装了请求。从命令行启动Python,然后编写请求的URL。从现在起,我必须弄清楚如何在.py文件中设置流(并查看流的内容)。欢迎您的建议!urllib2与子进程相比是否更省时?这取决于子进程,但当语言有核心库时,调用命令的子进程会停止,这肯定不是执行itTypeError的正确方法:POST数据应该是字节、字节的iterable或文件对象。它不能是str类型。我使用的是python 2.4.3。无法使用请求。ImportError:没有名为requests的模块。@Gary
pip install requests
我必须执行json.dumps(有效负载),但不需要在头上使用json.dumps方法。+1。据我所知,使用cURL可以完成的任何事情也可以通过python请求完成。还是用那个吧。这对我来找的东西很有效。感谢@OJFord虽然@OJFord启发了我们为什么不在python中使用curl,但Nitin描述了使用“请求”实现相同功能的最简单方法。我强烈推荐这个答案。哇,太棒了!这不是一个“让我为你做”的解决方案。我一直在努力找出为什么我的命令不起作用,即使一切看起来都是正确的。这个工具向我指出,我的请求的基本url中有导致问题的额外参数。对于刚开始做这些分类请求的人来说,这个工具非常适合检查这些简单的疏忽。回答得很好。