本文主要讲述官方提供的客户端以及自己写的增删查改工具:

ros_tool.py 功能总汇,展示界面用了python的GUL,模块用的为  tkinter  模块

其他文件为单个功能文件。

链接:https://pan.baidu.com/s/1_NIjG6gCQcnbp9Vwfi9Jyw 密码:98ex

运行方式:python3  ros_tool.py  ip  username  password    (LINUX下,装过ros,改为自己的 ip,用户名,密码 直接运行即可)

ros为python以及其他语言提供了接口,官方给出了一个   TCP客户端的例子:

# !/usr/bin/env python3

# -*- coding:utf-8 -*-

import sys, time, binascii, socket, select

import hashlib

class ApiRos:

"Routeros api"

def __init__(self, sk):

self.sk = sk

self.currenttag = 0

def login(self, username, pwd):

for repl, attrs in self.talk(["/login"]):

chal = binascii.unhexlify((attrs['=ret']).encode('UTF-8'))

md = hashlib.md5()

md.update(b'\x00')

md.update(pwd.encode('UTF-8'))

md.update(chal)

self.talk(["/login", "=name=" + username,

"=response=00" + binascii.hexlify(md.digest()).decode('UTF-8')])

def talk(self, words):

if self.writeSentence(words) == 0: return

r = []

while 1:

i = self.readSentence();

if len(i) == 0: continue

reply = i[0]

attrs = {}

for w in i[1:]:

j = w.find('=', 1)

if (j == -1):

attrs[w] = ''

else:

attrs[w[:j]] = w[j + 1:]

r.append((reply, attrs))

if reply == '!done': return r

def writeSentence(self, words):

ret = 0

for w in words:

self.writeWord(w)

ret += 1

self.writeWord('')

return ret

def readSentence(self):

r = []

while 1:

w = self.readWord()

if w == '': return r

r.append(w)

def writeWord(self, w):

print(("<<< " + w))

self.writeLen(len(w))

self.writeStr(w)

def readWord(self):

ret = self.readStr(self.readLen())

print((">>> " + ret))

return ret

def writeLen(self, l):

if l < 0x80:

self.writeStr(chr(l))

elif l < 0x4000:

l |= 0x8000

self.writeStr(chr((l >> 8) & 0xFF))

self.writeStr(chr(l & 0xFF))

elif l < 0x200000:

l |= 0xC00000

self.writeStr(chr((l >> 16) & 0xFF))

self.writeStr(chr((l >> 8) & 0xFF))

self.writeStr(chr(l & 0xFF))

elif l < 0x10000000:

l |= 0xE0000000

self.writeStr(chr((l >> 24) & 0xFF))

self.writeStr(chr((l >> 16) & 0xFF))

self.writeStr(chr((l >> 8) & 0xFF))

self.writeStr(chr(l & 0xFF))

else:

self.writeStr(chr(0xF0))

self.writeStr(chr((l >> 24) & 0xFF))

self.writeStr(chr((l >> 16) & 0xFF))

self.writeStr(chr((l >> 8) & 0xFF))

self.writeStr(chr(l & 0xFF))

def readLen(self):

c = ord(self.readStr(1))

if (c & 0x80) == 0x00:

pass

elif (c & 0xC0) == 0x80:

c &= ~0xC0

c <<= 8

c += ord(self.readStr(1))

elif (c & 0xE0) == 0xC0:

c &= ~0xE0

c <<= 8

c += ord(self.readStr(1))

c <<= 8

c += ord(self.readStr(1))

elif (c & 0xF0) == 0xE0:

c &= ~0xF0

c <<= 8

c += ord(self.readStr(1))

c <<= 8

c += ord(self.readStr(1))

c <<= 8

c += ord(self.readStr(1))

elif (c & 0xF8) == 0xF0:

c = ord(self.readStr(1))

c <<= 8

c += ord(self.readStr(1))

c <<= 8

c += ord(self.readStr(1))

c <<= 8

c += ord(self.readStr(1))

return c

def writeStr(self, str):

n = 0;

while n < len(str):

r = self.sk.send(bytes(str[n:], 'UTF-8'))

if r == 0: raise RuntimeError("connection closed by remote end")

n += r

def readStr(self, length):

ret = ''

while len(ret) < length:

s = self.sk.recv(length - len(ret))

if s == '': raise RuntimeError("connection closed by remote end")

ret += s.decode('UTF-8', 'replace')

return ret

def main():

s = None

for res in socket.getaddrinfo(sys.argv[1], "8728", socket.AF_UNSPEC, socket.SOCK_STREAM):

af, socktype, proto, canonname, sa = res

try:

s = socket.socket(af, socktype, proto)

except (socket.error, msg):

s = None

continue

try:

s.connect(sa)

except (socket.error, msg):

s.close()

s = None

continue

break

if s is None:

print('could not open socket')

sys.exit(1)

apiros = ApiRos(s);

apiros.login(sys.argv[2], sys.argv[3]);

#模拟用户自己输入代码进行api控制

tmpcommand=input('请输入你想查询的命令')

inputsentence = []

inputsentence.append(tmpcommand)

apiros.writeSentence(inputsentence)

while 1:

x = apiros.readSentence()

#print(x)

if x == ['!done'] or x==['!re', '=status=finished']:

break

#导出ros配置到ROS本地ghg1.rsc文件

# inputsentence = []

#

# inputsentence.append('/export')

# inputsentence.append('=file=ghg1.rsc')

# apiros.writeSentence(inputsentence)

# while 1:

#    x = apiros.readSentence()

#    #print(x)

#    if x == ['!done'] or x==['!re', '=status=finished']:

#        break

#从ros上传文件到ftp的代码

# inputsentence = []

# inputsentence.append('/tool/fetch')

# inputsentence.append('=address=192.168.0.108')

# inputsentence.append('=src-path=ghg1.rsc')

# inputsentence.append('=user=xxxxx')

# inputsentence.append('=mode=ftp')

# inputsentence.append('=password=xxxxx')

# inputsentence.append('=dst-path=123.rsc')

# inputsentence.append('=upload=yes')

# apiros.writeSentence(inputsentence)

# inputsentence = []

# while 1:

#    x = apiros.readSentence()

#    #print(x)

#    if x == ['!done'] or x==['!re', '=status=finished']:

#        break

#删除文件代码

# inputsentence = []

# inputsentence.append('/file/remove')

# inputsentence.append('=numbers=ghg1.rsc')

# apiros.writeSentence(inputsentence)

# while 1:

#    x = apiros.readSentence()

#    print(x)

#    if x == ['!done'] or x==['!re', '=status=finished']:

#        break

#官方循环代码,等待你输入命令行,可以用来测试代码命令行

# while 1:

#    r = select.select([s, sys.stdin], [], [], None)

#    if s in r[0]:

#        # something to read in socket, read sentence

#        x = apiros.readSentence()

#

#    if sys.stdin in r[0]:

#        # read line from input and strip off newline

#        l = sys.stdin.readline()

#        print(l)

#        l = l[:-1]

#        print(l)

#

#

#        # if empty line, send sentence and start with new

#        # otherwise append to input sentence

#        if l == '':

#            apiros.writeSentence(inputsentence)

#            inputsentence = []

#        else:

#            inputsentence.append(l)

if __name__ == '__main__':

main()

下面是本人写的一个小工具,可以进行路由的增删改查,代码有很多不足之处,删除功能时 容易出现问题,做了死循环,根据时间控制结束,性能非常低,有兴趣的可以改下:

运行方式:python3  ros_tool.py  ip  username  password    (LINUX下,装过ros,改为自己的 ip,用户名,密码 直接运行即可)

# !/usr/bin/env python

# -*- coding:utf-8 -*-

# Author:yhq

import sys, time, binascii, socket, select

from datetimeimport datetime

# import posix,

import hashlib

from tkinterimport *

# import subprocess

root = Tk()

root.title("ros工具")

root.geometry('1100x800')

class ApiRos:

"Routeros api"

def __init__(self, sk):

"""

初始化函数

:paramsk:

"""

self.sk = sk

self.currenttag =0

def login(self, username, pwd):

"""

登录函数

:paramusername:

:parampwd:

:return:

"""

for repl, attrsin self.talk(["/login"]):

chal = binascii.unhexlify((attrs['=ret']).encode('UTF-8'))

# 对 pwd 进行加密

md = hashlib.md5()

md.update(b'\x00')

md.update(pwd.encode('UTF-8'))

md.update(chal)

self.talk(["/login", "=name=" + username,

"=response=00" + binascii.hexlify(md.digest()).decode('UTF-8')])

def talk(self, words):

"""

:paramwords:

:return:

"""

if self.writeSentence(words) ==0:

return

r = []

while 1:

# python2 中  while 1 比 while True 执行速度快  大概快1/3  python3中两者基本没区别

i =self.readSentence()

if len(i) ==0:

continue

reply = i[0]

attrs = {}

for win i[1:]:

j = w.find('=', 1)

if j == -1:

attrs[w] =''

else:

attrs[w[:j]] = w[j +1:]

r.append((reply, attrs))

if reply =='!done':

return r

def writeSentence(self, words):

"""

:paramwords:

:return:

"""

ret =0

for win words:

self.writeWord(w)

ret +=1

self.writeWord('')

return ret

def readSentence(self):

"""

:return:

"""

r = []

while 1:

w =self.readWord()

if w =='':

return r

r.append(w)

def writeWord(self, w):

"""

:paramw:

:return:

"""

print(("<<< " + w))

self.writeLen(len(w))

self.writeStr(w)

def readWord(self):

"""

:return:

"""

ret =self.readStr(self.readLen())

print((">>> " + ret))

return ret

def writeLen(self, l):

"""

:paraml:

:return:

"""

if l <0x80:

self.writeStr(chr(l))

elif l <0x4000:

l |=0x8000

self.writeStr(chr((l >>8) &0xFF))

self.writeStr(chr(l &0xFF))

elif l <0x200000:

l |=0xC00000

self.writeStr(chr((l >>16) &0xFF))

self.writeStr(chr((l >>8) &0xFF))

self.writeStr(chr(l &0xFF))

elif l <0x10000000:

l |=0xE0000000

self.writeStr(chr((l >>24) &0xFF))

self.writeStr(chr((l >>16) &0xFF))

self.writeStr(chr((l >>8) &0xFF))

self.writeStr(chr(l &0xFF))

else:

self.writeStr(chr(0xF0))

self.writeStr(chr((l >>24) &0xFF))

self.writeStr(chr((l >>16) &0xFF))

self.writeStr(chr((l >>8) &0xFF))

self.writeStr(chr(l &0xFF))

def readLen(self):

"""

:return:

"""

c =ord(self.readStr(1))

if (c &0x80) ==0x00:

pass

elif (c &0xC0) ==0x80:

c &= ~0xC0

c <<=8

c +=ord(self.readStr(1))

elif (c &0xE0) ==0xC0:

c &= ~0xE0

c <<=8

c +=ord(self.readStr(1))

c <<=8

c +=ord(self.readStr(1))

elif (c &0xF0) ==0xE0:

c &= ~0xF0

c <<=8

c +=ord(self.readStr(1))

c <<=8

c +=ord(self.readStr(1))

c <<=8

c +=ord(self.readStr(1))

elif (c &0xF8) ==0xF0:

c =ord(self.readStr(1))

c <<=8

c +=ord(self.readStr(1))

c <<=8

c +=ord(self.readStr(1))

c <<=8

c +=ord(self.readStr(1))

return c

def writeStr(self, str):

"""

:paramstr:

:return:

"""

n =0

while n

r =self.sk.send(bytes(str[n:], 'UTF-8'))

if r ==0:

raise RuntimeError("connection closed by remote end")

n += r

def readStr(self, length):

"""

:paramlength:

:return:

"""

ret =''

while len(ret) < length:

s =self.sk.recv(length -len(ret))

if s =='':

raise RuntimeError("connection closed by remote end")

ret += s.decode('UTF-8', 'replace')

return ret

def check_interface():

"""

查看interface

:return:

"""

s =None

for resin socket.getaddrinfo(sys.argv[1], "8728", socket.AF_UNSPEC, socket.SOCK_STREAM):

af, socktype, proto, canonname, sa = res

try:

s = socket.socket(af, socktype, proto)

except socket.error:

s =None

continue

try:

s.connect(sa)

except socket.error:

s.close()

s =None

continue

break

if sis None:

print('could not open socket')

sys.exit(1)

global apiros

apiros = ApiRos(s)

apiros.login(sys.argv[2], sys.argv[3])

ls = ['/interface/print', '=.proplist=name']

apiros.writeSentence(ls)

ls1 = []

while 1:

x = apiros.readSentence()

if len(x) >1:

ls1.append(x[1][6:])

if x == ['!done']or x == ['!re', '=status=finished']:

break

# print('可用interface名字:%s' % ls1)

te.insert('1.0', " 可用interface名字: %s\n" % ls1)

te.insert('1.0', "*******************************\n")

l1 = Label(root, text="输入interface名:")

l1.pack()# 这里的side可以赋值为LEFT  RIGHT TOP  BOTTOM

global xls

xls = Entry()

xls.pack()

l2 = Label(root, text="输入ip地址段前三位(如192.168.3):")

l2.pack()# 这里的side可以赋值为LEFT  RTGHT TOP  BOTTOM

global sheet

sheet = Entry()

sheet.pack()

def add_ip():

n =0

t1 = time.time()

interface = xls.get()

ip = sheet.get()

for iin range(0, 25):

address ='%s.%s/24' % (ip, i)

network ='%s.0' % ip

inputsentence = ['/ip/address/add', '=address=%s' % address, '=interface=%s' % interface,

'=network=%s' % network, '=comment=%s %s' % (address, interface)]

apiros.writeSentence(inputsentence)

x = apiros.readSentence()

# print("添加address:%s成功" % address)

te.insert('1.0', "添加ip:%s成功\n" % address)

n +=1

t2 = time.time()

t = t2 - t1

# print('添加ip数量:%s' % n)

te.insert('1.0', "添加ip数量:%s\n" % n)

print('添加ip用时:%s' % t)

te.insert('1.0', "添加ip用时:%s\n" % t)

te.insert('1.0', "*******************************\n")

def remove_ip():

"""

批量删除ip

:return:

"""

s =None

for resin socket.getaddrinfo(sys.argv[1], "8728", socket.AF_UNSPEC, socket.SOCK_STREAM):

af, socktype, proto, canonname, sa = res

try:

s = socket.socket(af, socktype, proto)

except socket.error:

s =None

continue

try:

s.connect(sa)

except socket.error:

s.close()

s =None

continue

break

if sis None:

print('could not open socket')

sys.exit(1)

apiros = ApiRos(s)

apiros.login(sys.argv[2], sys.argv[3])

# 批量删除ip

global count

count = -1

global n

n =0

inputsentence = ['/ip/address/print', '=.proplist=.id,comment']

apiros.writeSentence(inputsentence)

while 1:

x = apiros.readSentence()

count +=1

if len(x) >2:

# x[1]为ip 的 id

while 1:

inputsentence = ['/ip/address/remove', x[1]]

apiros.writeSentence(inputsentence)

y = apiros.readSentence()

n +=1

if y == ['!done']or y == ['!re', '=status=finished']:

break

# print("删除%s成功" % x[2])

te.insert('1.0', "删除ip:%s成功\n" % x[2])

else:

pass

if x == ['!done']or x == ['!re', '=status=finished']:

break

def start_remove_ip():

"""

执行remove_ip

:return:

"""

t1 = time.time()

while 1:

remove_ip()

if n ==0:

break

t2 = time.time()

t = t2 - t1

# print('剩余ip总数:%s' % count)

te.insert('1.0', "剩余ip总数:%s成功\n" % count)

# print('删除ip用时:%s' % t)

te.insert('1.0', "删除ip用时:%s\n" % t)

te.insert('1.0', "*******************************\n")

def backup():

"""

备份设备

:return:

"""

s =None

for resin socket.getaddrinfo(sys.argv[1], "8728", socket.AF_UNSPEC, socket.SOCK_STREAM):

af, socktype, proto, canonname, sa = res

try:

s = socket.socket(af, socktype, proto)

except socket.error:

s =None

continue

try:

s.connect(sa)

except socket.error:

s.close()

s =None

continue

break

if sis None:

print('could not open socket')

sys.exit(1)

apiros = ApiRos(s)

apiros.login(sys.argv[2], sys.argv[3])

inputsentence = []

inputsentence.append('/system/backup/save')

# 按日期生成文件名

filename = datetime.now().strftime('%Y%m%d %H%M%S')

inputsentence.append(' =name=%s.backup' % filename)

apiros.writeSentence(inputsentence)

while 1:

x = apiros.readSentence()

print(x)

if x == ['!done']or x == ['!re', '=status=finished']:

# print("备份成功")

te.insert('1.0', "备份:%s.backup成功\n" % filename)

break

te.insert('1.0', "*******************************\n")

def check_ip():

"""

查看ip

:return:

"""

s =None

for resin socket.getaddrinfo(sys.argv[1], "8728", socket.AF_UNSPEC, socket.SOCK_STREAM):

af, socktype, proto, canonname, sa = res

try:

s = socket.socket(af, socktype, proto)

except socket.error:

s =None

continue

try:

s.connect(sa)

except socket.error:

s.close()

s =None

continue

break

if sis None:

print('could not open socket')

sys.exit(1)

apiros = ApiRos(s)

apiros.login(sys.argv[2], sys.argv[3])

# 查看ip

inputsentence = ['/ip/address/print', ]

apiros.writeSentence(inputsentence)

count1 = -1

while 1:

x = apiros.readSentence()

count1 +=1

if x == ['!done']or x == ['!re', '=status=finished']:

break

print('ip总数:%s' % count1)

te.insert('1.0', "ip总数:%s\n" % count1)

te.insert('1.0', "*******************************\n")

def check_route():

"""

查看route

:return:

"""

s =None

for resin socket.getaddrinfo(sys.argv[1], "8728", socket.AF_UNSPEC, socket.SOCK_STREAM):

af, socktype, proto, canonname, sa = res

try:

s = socket.socket(af, socktype, proto)

except socket.error:

s =None

continue

try:

s.connect(sa)

except socket.error:

s.close()

s =None

continue

break

if sis None:

print('could not open socket')

sys.exit(1)

apiros = ApiRos(s)

apiros.login(sys.argv[2], sys.argv[3])

# 查看route

inputsentence = ['/ip/route/print', ]

apiros.writeSentence(inputsentence)

count2 = -1

while 1:

x = apiros.readSentence()

count2 +=1

if x == ['!done']or x == ['!re', '=status=finished']:

break

# print('route总数:%s' % count2)

te.insert('1.0', "route总数:%s\n" % count2)

te.insert('1.0', "*******************************\n")

def add_route():

"""

批量添加route

:return:

"""

gateway = xls.get()

ip = sheet.get()

for iin range(0, 10):

dst_address ='%s.%s.0/24' % (ip[:ip.rfind('.')], i)

# pref_src = '%s.%s.%s' % (ip, i, i)

inputsentence = ['/ip/route/add', '=dst-address=%s' % dst_address, '=gateway=%s' % gateway,

'=comment=%s ' % dst_address]

apiros.writeSentence(inputsentence)

x = apiros.readSentence()

# print("添加route:%s成功" % dst_address)

te.insert('1.0', "添加route:%s成功\n" % dst_address)

te.insert('1.0', "*******************************\n")

def remove_route():

"""

批量删除route

:return:

"""

s =None

for resin socket.getaddrinfo(sys.argv[1], "8728", socket.AF_UNSPEC, socket.SOCK_STREAM):

af, socktype, proto, canonname, sa = res

try:

s = socket.socket(af, socktype, proto)

except socket.error:

s =None

continue

try:

s.connect(sa)

except socket.error:

s.close()

s =None

continue

break

if sis None:

print('could not open socket')

sys.exit(1)

apiros = ApiRos(s)

apiros.login(sys.argv[2], sys.argv[3])

# 批量删除route

global count

count = -1

global n

n =0

inputsentence = ['/ip/route/print', '?>comment=', '=.proplist=.id,gateway']

apiros.writeSentence(inputsentence)

while 1:

x = apiros.readSentence()

count +=1

if len(x) ==3:

inputsentence = ['/ip/route/remove', x[1]]

apiros.writeSentence(inputsentence)

y = apiros.readSentence()

n +=1

# print ("删除%s成功" % x[2])

te.insert('1.0', "删除%s成功\n" % x[2])

if x == ['!done']or x == ['!re', '=status=finished']:

break

def start_remove_route():

"""

执行 remove_route

:return:

"""

t1 = time.time()

t2 = t1 +15

while 1:

remove_route()

t3 = time.time()

if t3 > t2:

te.insert('1.0', "*******************************\n")

break

def remove_re():

"""

route去重

:return:

"""

s =None

for resin socket.getaddrinfo(sys.argv[1], "8728", socket.AF_UNSPEC, socket.SOCK_STREAM):

af, socktype, proto, canonname, sa = res

try:

s = socket.socket(af, socktype, proto)

except socket.error:

s =None

continue

try:

s.connect(sa)

except socket.error:

s.close()

s =None

continue

break

if sis None:

print('could not open socket')

sys.exit(1)

apiros = ApiRos(s)

apiros.login(sys.argv[2], sys.argv[3])

# 批量删除重复route

global count

count = -1

global n

n =0

inputsentence = ['/ip/route/print', '?=active=false', '=.proplist=.id,gateway']

apiros.writeSentence(inputsentence)

while 1:

x = apiros.readSentence()

count +=1

if len(x) ==3:

inputsentence = ['/ip/route/remove', x[1]]

apiros.writeSentence(inputsentence)

y = apiros.readSentence()

n +=1

# print("删除%s成功" % x[2])

te.insert('1.0', "去重%s成功\n" % x[2])

if x == ['!done']or x == ['!re', '=status=finished']:

break

def start_remove_re():

"""

执行remove_re

:return:

"""

t1 = time.time()

t2 = t1 +15

while 1:

remove_re()

t3 = time.time()

if t3 > t2:

te.insert('1.0', "*******************************\n")

break

te = Text()

te.pack()

Button(root, text="备份设备", bg='green', command=backup).pack(padx=10, pady=10, ipadx=3, side=LEFT)

Button(root, text="查看可用interface", bg='green', command=check_interface).pack(padx=5,  pady=20, side=LEFT)

Button(root, text="查看ip", bg='green', command=check_ip).pack(padx=5, pady=10,  ipadx=3, side=LEFT)

Button(root, text="查看route", bg='green', command=check_route).pack(padx=5,  pady=15, ipadx=3, side=LEFT)

Button(root, text="删除ip", bg='#ff3300', command=start_remove_ip).pack(padx=5, pady=10,  ipadx=3, side=RIGHT)

Button(root, text="删除route", bg='#ff3300', command=start_remove_route).pack(padx=5,  pady=10, ipadx=3, side=RIGHT)

Button(root, text="route去重", bg='#ff3300', command=start_remove_re).pack(padx=5,  pady=10, ipadx=3, side=RIGHT)

Button(root, text="增加ip", bg='#9900ff', command=add_ip).pack(padx=5, pady=10,  ipadx=3,  side=RIGHT)

Button(root, text="增加route", bg='#9900ff', command=add_route).pack(padx=5, pady=10, ipadx=3, side=RIGHT)

root.mainloop()

python会调用linuxapi吗_RouterOS之python调用API相关推荐

  1. python方法调用名字不一样_python中调用父类同名方法

    知识回顾: 上节我们学习了类的构造方法. Python中构建构造方法主要使用__init__魔法方法. 实际项目操作中,由于类的继承导致可能覆盖同名的构造方法,导致只能使用子类的构造,而无法调用父类的 ...

  2. 使用Cython库包对python的py文件(源码)进行加密,把python的.py文件生成.so文件并调用

    文章目录: 1 准备环境 2 调用`Cython库包`把python的`.py`文件生成`.so`文件 2.1 写源码文件 2.2 调用源码接口 2.3 调用Cython库把`.py`源码生成`.so ...

  3. Python学习笔记之六:在VS中调用Python

    1,安装配置好Python本身的运行环境,以能在命令行下运行py脚本为准 2,将Python的根目录下的include文件夹,添加到VS的项目属性->配置属性->C/C++->&qu ...

  4. Python基础day04【函数(定义与调用、文档说明、传参函数、全局变量、返回值、嵌套调用)】

    视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员] Python基础day04[字典]    目录 3.函数 函数的定义和调用 函数定义 PEP8规范 ...

  5. c调用python脚本如何获取结果_使用C++调用Python代码的方法详解

    一.配置python环境问题 1.首先安装Python(版本无所谓),安装的时候选的添加python路径到环境变量中 安装之后的文件夹如下所示: 2.在VS中配置环境和库 右击项目->属性-&g ...

  6. python调用libvirt_通过python获取kvm虚拟机的监控信息(基于libvirt API)

    通常在我们的云环境中,为了保证云平台中虚拟机的正常运行,基本都需要这样一个功能,就是收集虚拟机的监控数据,比如cpu的使用率.内存的使用率.磁盘io.网络io等基本信息.可以利用这些信息及时调整云平台 ...

  7. net能和python结合吗_如何不用安装python就能在.NET里调用Python库

    前言 Pythonnet这个屌爆的项目的出现,使得我们可以用一种新的方式,让C#可以和Python之间进行互操作.但是它的设置和部署可能有点问题,真的是这样吗? 本文我会介绍Python.Includ ...

  8. c++调用python接口作用是_利用Boost::Python实现C++调用python接口

    利用Boost::Python实现C++调用python接口 2019年11月06日 阅读数:7 这篇文章主要向大家介绍利用Boost::Python实现C++调用python接口,主要内容包括基础应 ...

  9. Python:为什么必须在方法定义和调用中明确使用'self'?

    面向对象的语言有对象.对象是状态和行为的组合.对象需要访问自己的状态.这样做基本上有两个主要选择.要么你明确地说你何时访问一个对象的状态(通过self,this或者其他类似的东西),或者语言会为你找出 ...

最新文章

  1. Timus 1837. Isenbaev's Number
  2. hibernate正向生成数据库表以及配置——Student.java
  3. Java学习笔记17
  4. android下拉刷新动画效果代码_vue项目实录:下拉刷新组件的开发及slot的使用
  5. ECMAScript标准资料
  6. SpringMvc之参数绑定注解详解
  7. log4j记录不同的日志_使用log4j将不同类型的日志信息记录到不同的文件中
  8. ASP.NET Core Kestrel 中使用 HTTPS (SSL)
  9. 深入理解Tomcat和Jetty源码之第二篇servlet规范和servlet容器
  10. C++|Qt最简单的http的get请求
  11. 在win7下安装VC6.0
  12. c语言 随机漫步,随机漫步理论
  13. c++程序无法进入断点的原因
  14. AppScan下载安装教程
  15. opencv安装路径以及使用
  16. Pygame实现小球躲避
  17. 网易云项目(Vue)
  18. 公用移动数据通信网(CHINAMDN)(转)
  19. django Email
  20. 干货丨大数据时代电子政务面临的机遇和挑战

热门文章

  1. OCP读书笔记(5) - 使用RMAN创建备份
  2. 富士通推出MB95200H/10H/20H系列用于家电的LPC微控制器
  3. Pytorch交叉熵损失函数torch.nn.functional as F
  4. ndarray保存成文本
  5. 绘制ROC 曲线 计算 AUC PR曲线(精准率 召回率)示例
  6. binary_crossentropy(二元交叉熵)的定义
  7. pandas.core.frame.DataFrame是什么数据结构,为什么要如此取值  [ ]中嵌套[ ]
  8. FileInputStream 之read(byte [] b)方法
  9. 深度学习崛起十年:“开挂”的OpenAI革新者
  10. 大赛季(2020)新一代信息技术行业赛赛事公告