• [技术干货] Python获取指定网段正在使用的IP
    #!/usr/bin/env python# -*- coding: utf-8 -*-  ''''' 使用方法样例 python test20.py 192.168.1.1 (会扫描192.168.1.1-255的ip) 多线程加速后大概十几秒'''import platformimport sysimport osimport timeimport threading live_ip = 0  def get_os():  os = platform.system()  if os == "Windows":    return "n"  else:    return "c"  def ping_ip(ip_str):  cmd = ["ping", "-{op}".format(op=get_os()),      "1", ip_str]  output = os.popen(" ".join(cmd)).readlines()  for line in output:    if str(line).upper().find("TTL") >= 0:      print("ip: %s is ok ***" % ip_str)      global live_ip      live_ip += 1      break  def find_ip(ip_prefix):  '''''  给出当前的127.0.0 ,然后扫描整个段所有地址  '''  threads = []  for i in range(1, 256):    ip = '%s.%s' % (ip_prefix, i)    threads.append(threading.Thread(target=ping_ip, args={ip, }))  for i in threads:    i.start()  for i in threads:    i.join()  if __name__ == "__main__":  print("start time %s" % time.ctime())  cmd_args = sys.argv[1:]  args = "".join(cmd_args)  ip_pre = '.'.join(args.split('.')[:-1])  find_ip(ip_pre)  print("end time %s" % time.ctime())  print('本次扫描共检测到本网络存在%s台设备' % live_ip)
  • [热门活动] 【云享MindTalks·第八期】#神秘的夜幕团队成员张冶青加入群聊#Python与Go不得不说的选型之争
    那晚你错过的交流(PPT文末自取)那一晚,你没来第八期云享MindTalks,可能错过了一场精彩的对话交流~餐前小甜点助手小采访:你为什么选择用Python?因为语法简单?优雅?还是因为免费?:不,因为惜命,“人生苦短,我用Python”。暖心小贴士:Python的编写效率高,可以用Python省下的时间去植发哦。助手小采访:用Python你幸福吗?:我姓张。助手小采访:……,那可以请您简单分享一下Python的使用体验吗?:动态一时爽,一直动态一直爽。助手小采访:那是不是意味着这个工具很好用,妈妈再也不用担心我出bug的感觉?:什么BUG?!!暖心小贴士:动态一时爽,重构火葬场,这是动态语言的弊端。助手小采访:听说您之后又去学了Go?请用一句话证明。:err !=nil精彩正餐吃到饱交流者1号:Go的gorotine和Python的corotine区别?张老师:gorotine应该就是Go语言的协程,corotine是Python语言的协程,corontine是借鉴了JavaScript里的语法。协程你可以想象为轻量型的线程。交流者2号:我现在想修全栈向,Python用了三年,不会别的语言。一直在开脚本和API,想做点带前端的完整作品。未来趋势来看,是修炼react+go还是继续Python撸flask+django?张老师:谈点个人看法啊,Python用了三年说明你已经很熟悉Python了。从我自己的经历来说,我也是先学了Python然后又学习了Go,我觉得我们学点其他的知识,有助于拓宽我们的知识面,能够帮助到自己打开视野。react是Javascript的一个分支,一个框架,如果你想要修全栈的话,是可以学习一下的。现在react,vue比较主流,flask的话,目前不是那么的主流。交流者3号:Python使用uvloop的话,速度比Go如何?张老师:这个问题我没有实践过uvloop,无法给你做准确的判断,如果你用Python做一些底层的设计的话,能够对它进行一些优化,很可能会取得很好的效果。交流者4号:前端是vue还是react?如果时间有限的话。张老师:国内的话vue还是很多的,国外多是react,如果时间有限的话,建议学习vue,可以从3开始学;如果时间允许的话,建议两个都可以学着看看。交流者5号:Python转数据挖掘可以吗?不知道从何下手。张老师:如果你是用Python做数据分析,是完全可以转数据挖掘的。数据挖掘的话,还包含数据分析和机器学习的,Python的话,比较好的一点,就是有很多库都给你封装好了。如果说你能理解基础原理的话,完全是可以转的。交流者6号:Go和dart差不多吗?张老师:我知道移动端一个比较火的框架就是用dart语言写的,dart的话更多的可能会用于移动开发,相对来说Go的话使用的范围更广。交流者7号:老师是怎么学习Go的?张老师:总结下来的话,就是实践,“实践出真理”,我觉得我个人比较有效的学习方式就是通过实践,因为有Python的基础,经常做Python和go的对比,加强自己的理解,也更有意思。learn by doing是非常有效的学习方式。交流者8号:老师您的CrawLab从Python到Go重构了多久?张老师:重构了大概二十天左右,最近在着手做大的架构升级,预计明年初可以发版~Github: https://github.com/crawlab-team/crawlabDemo: https://demo-pro.crawlab.cn文档: https://docs.crawlab.cn欢迎大家来给我+star哦~谢谢交流者9号:请问有什么推荐的项目吗?张老师:推荐可以从小项目入手,比如: PPT: https://tinyurl.com/yd7gdf4k- 视频: https://www.bilibili.com/video/BV1Az4y1r7gE/- Go入门开源项目:  1. https://github.com/linxGnu/goseaweedfs  2. https://github.com/spf13/viper  3. https://github.com/crawlab-team/crawlab-go-sdk  4. https://github.com/jaeles-project/gospider学习资料推荐Python  基础     •https://github.com/jackfrued/Python-Core-50-Courses (中文)     •https://github.com/learnbyexample/Python_Basics (英文)  进阶    《Python高性能编程》 - Micha Gorelick & Ian Ozsvald    《Python核心编程》 - Wesley Chun    《利用Python进行数据分析》 - Wes McKinney    《Python自然语言处理》 - Steven Bird, Ewan Klein & Edward Loper    《Python 3网络爬虫开发实战》 - 崔庆才    《Python 3网络爬虫宝典》 - 韦世东     极客时间《Python核心技术与实战》 -景霄Go   基础     掘金小册《基于 Go 语言构建企业级的 RESTful API 服务》 - 雷克斯    《Go语言核心编程》 - 李文塔  进阶  《Go语言实战》 - William Kennedy, Brian Ketelsen & Erik St. Martin    《Go语言高级编程》 - 柴树杉 &曹春晖更多精彩,敬请期待~扫码进微信群,仅限200人开始时间12月17日 20:00活动介绍云享MindTalks是由华为云DevCloud团队携手云享专家共同策划进行的系列技术交流活动。各业界大咖纷纷现身群聊,以即时对话形式,来进行最直接的技术交流和思想碰撞。不同领域的专家,各样的业界话题尽在此处,为保证极简极高效,活动仅20分钟,限量200人,先进先得。编程语言那么多那个才是你的心头好?是优雅简单的Python?还是高效精致的Go?动态与静态语言的选型之争,由张冶青老师带你全面分析! 专家介绍知名外企前端开发工程师神秘Night Team(夜幕团队)成员8年软件开发经验,全干工程师专注前端、爬虫和数据分析领域活动规则1.扫码加小助手入群聊,仅限200人,先到先得。2.对未能及时回复的问题,由助手收集集中回答。3.更多资源和活动请进入云享MindTalks VIP群。4.抽奖奖品为限定HE2E知识卡牌和老师推荐书籍         《Go语言核心编程》。
  • [体验官] python 发送邮件
    # 发邮件的库 import smtplib #邮件文本 from email.mime.text import MIMEText # smtp服务器 SMTPServer ="smtp.126.com" # 发邮件的地址 Sender = "****@126.com" #发送者邮箱的密码 这里是在网易邮箱的设置菜单栏获取的授权码 passwd = "*******************" # 设置发送的内容 message = "hello world! " # 转换成邮件文本 msg = MIMEText(message) # 标题 msg["Subject"] = "来自python的问候" #发送者 msg["From"] = Sender #    创建SMTP服务器       服务器    端口号 mailServer = smtplib.SMTP(SMTPServer, 25) #登录邮箱 mailServer.login(Sender, passwd) # 发送邮件 mailServer.sendmail(Sender, ["******@dingtalk.com"],msg.as_string())      # 退出邮箱 mailServer.quit()一开始想用最常用的OA邮箱测试,发现发不了,提示TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。想了下,推测是由于护网行动,OA断掉了外网的访问权限可能有关系。重新用126.com账号测试,授权码需要在网易的邮件设置栏里面找,发送短信验证后获得。
  • [技术干货] python 对象真假值的实例(哪些视为False)
    对于python语言的True和False我们并不陌生了,在学习的过程中常会遇到这样的返回值,那么True真和False假的具体含义是什么?本文就为大家来说说python中真假的含义。真和假的概念同许多程序语言一样,python中真假也是可以用整数0和1来表示,整数0表示假,整数1表示真。其实真和是python每个对象都具体的一种属性,这种属性不是真就是假。在python中一切都是对象,像是数据结构,python视空的数据结构为False假,相反不是空的数据结构则为True真。下面来看下python中对象真、假值的示例1234567"spam"  True""    False[]    False{}    False1    True0.0   FalseNone   FalseNone的作用上图示例中最后的None,会被认为是False,其实它是python中一个特殊的对象,一种特殊数据类型的唯一值,作用和C语言中的null比较像,起到空的占位作用。如下所示:1234567x = [None]*100>>> x [None, None, None, None, None, None,...] >>> >>> x[2]='a'>>> x [None, None, 'a', None, None, None,...]None起到了一个占位作用,过后可以通过索引赋值来替换内容。从这个例子中可以看出,None并不是没有内容,它是一个真正对的象,它在python中还有其它用法。要想真的明白Python语言中真和假的含义,更多的是需要理解,要多操作编写代码是对理解非常有帮助的。补充知识:python中True,False与0,1之间的关系demo112345678>>> print(True == 1)>>> print(True == 2)>>> print(False == 0)>>> print(False == 2)TrueFalseTrueFalse这说明1与True,0与False在python来说是完全相等的东西。demo2123456>>> x = 5>>> if x%2:>>>   x += 1>>> else:>>>   x -= 1>>> print(x)在demo2中可以看出二者之间关系的妙用。x%2=0 <——> x%2 = True
  • [技术干货] python 自定义异常和主动抛出异常(raise)的操作
    前言有时候python自带异常不够用,如同java,python也可以自定义异常,并且可以手动抛出。注意,自定义异常只能由自己抛出。python解释器是不知道用户自定义异常是什么鬼的。raise语句主动抛出异常。格式:主动抛出异常终止程序raise 异常名称(‘异常描述')raise RuntimeError('testError')主动抛出这个异常,并加以解释。自定义异常python的异常分为两种.1、内建异常,就是python自己定义的异常。2、不够用,用户自定义异常,首先看看python的异常继承树我们可以看到python的异常有个大基类。然后继承的是Exception。所以我们自定义类也必须继承Exception。123#最简单的自定义异常class FError(Exception):  pass抛出异常、用try-except抛出1234try:  raise FError("自定义异常")except FError as e:  print(e)在这里给一个简单的自定义异常类模版。123456789101112class CustomError(Exception):  def __init__(self,ErrorInfo):    super().__init__(self) #初始化父类    self.errorinfo=ErrorInfo  def __str__(self):    return self.errorinfo if __name__ == '__main__':  try:    raise CustomError('客户异常')  except CustomError as e:    print(e)补充知识:Python自定义异常及常见异常类型对于try…except…else…finally123456789101112131415161718192021222324def self_error(type_list): """异常处理函数 传入一个可迭代对象,处理参数传入错误情况 :paramtype_list:一个可迭代对象 """ try: for i in type_list:  print(i) except: print("不是可迭代对象") else: print("没有发生错误") finally: print("程序运行结束")self_error("abc")"""abc没有发生错误程序运行结束"""self_error(2)"""不是可迭代对象程序运行结束"""由程序可以看出如果try部分顺利执行,则会执行else部分,如果try部分出现错误则会执行except部分,但是两种情况最后都输出了finally部分。当然,else和finally部分是可以省略的。我们可以自定义输出错误类型,需要用到raise函数。1234567891011121314def self_error(type_num):  """异常处理函数     自定义异常函数,用于抛出异常  :paramtype_num:用于判断是否抛出异常的值  :return 异常信息   """  if type_num<10:   raise ValueError("取值小于10")  else:   return 200 if __name__=="__main__": self_error(11) #200 self_error(9) #ValueError: 取值小于10raise抛出异常只适用于python的标准异常类异常名称 描述ArithmeticError 所有数值计算错误的基类AssertionError 断言语句失败AttributeError 对象没有这个属性BaseException 所有异常的基类DeprecationWarning 关于被弃用的特征的警告EnvironmentError 操作系统错误的基类EOFError 没有内建输入,到达EOF 标记Exception 常规错误的基类FloatingPointError 浮点计算错误FutureWarning 关于构造将来语义会有改变的警告GeneratorExit 生成器(generator)发生异常来通知退出ImportError 导入模块/对象失败IndentationError 缩进错误IndexError 序列中没有没有此索引(index)IOError 输入/输出操作失败KeyboardInterrupt 用户中断执行(通常是输入^C)KeyboardInterrupt 用户中断执行(通常是输入^C)KeyError 映射中没有这个键LookupError 无效数据查询的基类MemoryError 内存溢出错误(对于Python 解释器不是致命的)NameError 未声明/初始化对象 (没有属性)NotImplementedError 尚未实现的方法OSError 操作系统错误OverflowError 数值运算超出最大限制OverflowWarning 旧的关于自动提升为长整型(long)的警告PendingDeprecationWarning 关于特性将会被废弃的警告ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象RuntimeError 一般的运行时错误RuntimeWarning 可疑的运行时行为(runtime behavior)的警告StandardError 所有的内建标准异常的基类StopIteration 迭代器没有更多的值SyntaxError Python 语法错误SyntaxWarning 可疑的语法的警告SystemError 一般的解释器系统错误SystemExit 解释器请求退出SystemExit Python 解释器请求退出TabError Tab 和空格混用TypeError 对类型无效的操作UnboundLocalError 访问未初始化的本地变量UnicodeDecodeError Unicode 解码时的错误UnicodeEncodeError Unicode 编码时错误UnicodeError Unicode 相关的错误UnicodeTranslateError Unicode 转换时错误UserWarning 用户代码生成的警告ValueError 传入无效的参数Warning 警告的基类WindowsError 系统调用失败ZeroDivisionError 除(或取模)零 (所有数据类型)
  • [赋能学习] 编译安装python3
    ### 配置yum源 1. 上传系统安装镜像文件 CentOS-7.6-x86_64-DVD-1810.iso 到客户端节点,例如/opt目录 ​ 2. 将镜像文件挂载到/media目录 ``` mount -o loop /opt/CentOS-7.6-x86_64-DVD-1810.iso /media ``` 3. 配置/etc/yum.repos.d/目录下的repo文件,保证该目录下只有一个以.repo结尾的文件,其内容如下 ``` [base] name=file baseurl=file:///media enabled=1 gpgcheck=0 ``` 4. 配置完毕后检查下yum源,如图执行yum repolist命令 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202012/10/164449p1ncagerkbfi3tjv.png) ### 安装python3 从python官网下载python3源码包,本例中下载的链接为 https://www.python.org/ftp/python/3.7.8/Python-3.7.8.tgz 将获取的Python-3.7.8.tgz上传到/opt目录下,安装命令如下 ``` yum -y install zlib-devel bzip2-devel openssl-devel openssl-static ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libcap-devel xz-devel libffi-devel lzma gcc cd /opt rm -rf /tmp/Python-3.7.8 tar -zxvf Python-3.7.8.tgz -C /tmp mv /tmp/Python-3.7.8 /usr/local/python-3.7 cd /usr/local/python-3.7/ ./configure --prefix=/usr/local/sbin/python-3.7 make && make install ln -sv /usr/local/sbin/python-3.7/bin/python3 /usr/bin/python3 ln -sv /usr/local/sbin/python-3.7/bin/pip3 /usr/bin/pip3 ``` ## 批量安装 当一个集群有上百台、上千台节点时,我们如果按上面步骤一台一台安装就比较慢了,可以使用FusionInsight_SetupTool里的批量操作工具来安装 ### 前置条件 - 在安装操作系统时所有节点需安装gcc、make、cmake工具; - 所有节点已开启sshd服务,且已获取root用户和密码,所有节点root用户密码建议配置相同 - 已将Python-3.7.8.tgz上传到主OMS节点的/opt目录下 - 已将版本包中的 FusionInsight_SetupTool-*.tar.gz上传到/opt目录,其中*对应使用的版本号 ### 安装步骤 以root用户登录OMS节点执行 1. 解压缩 FusionInsight_SetupTool-*.tar.gz ``` tar -zxvf FusionInsight_SetupTool-*.tar.gz ``` 2. 进入“/opt/FusionInsight_SetupTool/preinstall/tools/cluster”目录,编辑“cluster.ini”文件,样例如下 其中g_hosts表示所有主机IP地址,支持范围写入,例如192.168.10.[2-10] ``` g_hosts="190.222.20.123,190.222.20.136,190.222.20.185" g_user_name="root" g_password="" g_port=22 g_timeout=500 ``` 3. 将python3安装包上传到所有节点 命令参考 ``` cd /opt/FusionInsight_SetupTool/preinstall/tools/cluster ./clusterscp.sh put /opt/Python-3.7.8.tgz /opt ``` 4. 将所有节点的python3安装包解压缩 ``` ./clustercmd.sh "tar -zxf /opt/Python-3.7.8.tgz -C /opt" ``` 5. 所有节点编译安装python3 ``` ./clustercmd.sh "cd /opt/Python-3.7.8 && ./configure --prefix=/usr/local/python3 && make && make install && ln -s /usr/local/python3/bin/python3.7.8 /usr/bin/python3 && ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3" ```
  • [技术干货] Python利用imshow制作自定义渐变填充柱状图(colorbar)
    目的在各种各样的理论计算中,常常需要绘制各种填充图,绘制完后需要加渐变填充的colorbar。可是有些软件如VMD,colorbar渲染后颜色分布有些失真,不能较准确的表达各颜色对应的数值。用ps中的渐变填充可以解决该问题,但很多电脑配置较低,不能很好的运行ps。Python也可以直接绘制colorbar,填充颜色就好。如cmap中的bwr渐变本人就比较常用。然而,有时候颜色范围是负数范围多于正数范围(如:colorbar需要表示 [-60,40]这段,蓝色表示负数,红色表示正数,白色应该在colorbar由下往上60%处),bwr渐变将white置于50%处显得不够合理,因此需要自定义填充。本文以imshow() 函数来进行填充柱状图达到自定义colorbar的目的。interpolation=‘bicubic' 可以很好的做出渐变效果。代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455# -*- coding: utf-8 -*-"""Created on Wed Dec 9 10:36:54 2020 @author: fya""" import matplotlib.pyplot as pltimport numpy as npfrom matplotlib.colors import ListedColormap,LinearSegmentedColormapimport matplotlib as mpl fig, ax = plt.subplots(dpi=96)ax.set(xlim=(1,10), ylim=(-0.1,101), autoscale_on=False) #创建图像范围 a = np.array([[1, 1],       [2, 2],       [3, 3],       [4, 4],       [5, 5]]) #每种渐变色分成五段(array五行),数字表示在colormap对应的深浅print(a.shape) clist=['white','blue'] #线性变化颜色由上面array值 小到大,越小,越白,达到上白下蓝的渐变效果clist2=['red','white'] #渐变色2,用于白色到红色填充,array越小,越红,达到上红下白的效果newcmp = LinearSegmentedColormap.from_list('chaos',clist)newcmp2 = LinearSegmentedColormap.from_list('chaos',clist2)  plt.imshow(a,cmap=newcmp,interpolation='bicubic',extent=(1,10,0,60))#60%都是蓝色到白色渐变plt.imshow(a,cmap=newcmp2,interpolation='bicubic',extent=(1,10,60,100)) #白色设置在60%处 frame = plt.gca() #读取当前图层ax.yaxis.tick_right() #纵坐标移到右边ax.set_yticklabels(('-80','-60','-40','-20','0','20','40')) #自定义yticks显示的值,第一个label不显示frame.spines['top'].set_visible(False) #上框线不显示frame.spines['bottom'].set_visible(False)frame.spines['right'].set_visible(False)frame.spines['left'].set_visible(False)plt.xticks([]) #x坐标不要  plt.show()fig.savefig('colorbar.tif',dpi=600,format='tif')print('Done!') #N = 10#x = np.arange(N) + 0.15#y = np.random.rand(N) #width = 0.4#for x, y in zip(x, y):  #ax.imshow(a, interpolation='bicubic', extent=(x, x+width, 0, y), cmap=plt.cm.Blues_r) #ax.set_aspect('auto')#plt.show()代码2,渐变色分100段123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475# -*- coding: utf-8 -*-"""Created on Wed Dec 9 10:36:54 2020 @author: fanyiang""" import matplotlib.pyplot as pltimport numpy as npfrom matplotlib.colors import ListedColormap,LinearSegmentedColormapimport matplotlib as mplimport pandas as pdimport os fig, ax = plt.subplots(dpi=96)ax.set(xlim=(1,10), ylim=(-0.1,101), autoscale_on=False) #a = np.array([[1, 1],       #[2, 2],       #[3, 3],       #[4, 4],       #[5, 5]]) #每种渐变色分成五段(array五行),数字表示在colormap对应的深浅avalue=locals()dfvalue=locals()     for i in range(1,101):  avalue['a'+str(i)]=np.array([[i,i]]) #渐变色分为100段,分的更细  dfvalue['df'+str(i)]=pd.DataFrame(avalue['a'+str(i)]) #转dataframe  df=dfvalue['df'+str(i)]  df.to_csv("temp.csv", mode='a',header=None) #暂存csv文件,第一列会把每一次循环的index放进去df3=pd.read_csv('temp.csv',header=None)#读取csvdf3.columns=['序号','x','y']#column命名,第一列废弃df3=df3.drop('序号',axis=1)#删除第一列a=np.array(df3) #转arrayprint(df3.head())                                                                                                                                           #a=np.vstack((a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)) print(a) clist=['white','blue'] #线性变化颜色由上面array值 小到大clist2=['red','white']newcmp = LinearSegmentedColormap.from_list('chaos',clist)newcmp2 = LinearSegmentedColormap.from_list('chaos',clist2)  plt.imshow(a,cmap=newcmp,interpolation='bicubic',extent=(1,10,0,60))plt.imshow(a,cmap=newcmp2,interpolation='bicubic',extent=(1,10,60,100)) #白色设置在60%处 frame = plt.gca() #读取当前图层ax.yaxis.tick_right() #纵坐标移到右边ax.set_yticklabels(('-80','-60','-40','-20','0','20','40')) #自定义yticks显示的值,第一个label不显示frame.spines['top'].set_visible(False) #上框线不显示frame.spines['bottom'].set_visible(False)frame.spines['right'].set_visible(False)frame.spines['left'].set_visible(False)plt.xticks([]) #x坐标不要  plt.show()fig.savefig('colorbar.tif',dpi=600,format='tif')os.remove("temp.csv") #删除临时的csv文件print('Done!') #N = 10#x = np.arange(N) + 0.15#y = np.random.rand(N) #width = 0.4#for x, y in zip(x, y):  #ax.imshow(a, interpolation='bicubic', extent=(x, x+width, 0, y), cmap=plt.cm.Blues_r) #ax.set_aspect('auto')#plt.show()效果效果1效果2
  • [技术干货] python 实现ping测试延迟的两种方法
    一.python实现ping返回延迟繁琐版123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107#!/usr/bin/python3.7# !coding:utf-8__author__ = 'hsz'__date__ = 'Thu Feb 27 22:41:15 EST 2020' import timeimport structimport socketimport selectimport sys  def chesksum(data):  """  校验  """  n = len(data)  m = n % 2  sum = 0  for i in range(0, n - m, 2):    sum += (data[i]) + ((data[i + 1]) << 8) # 传入data以每两个字节(十六进制)通过ord转十进制,第一字节在低位,第二个字节在高位  if m:    sum += (data[-1])  # 将高于16位与低16位相加  sum = (sum >> 16) + (sum & 0xffff)  sum += (sum >> 16) # 如果还有高于16位,将继续与低16位相加  answer = ~sum & 0xffff  # 主机字节序转网络字节序列(参考小端序转大端序)  answer = answer >> 8 | (answer << 8 & 0xff00)  return answer   '''  连接套接字,并将数据发送到套接字  '''  def raw_socket(dst_addr, imcp_packet):  rawsocket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname("icmp"))  send_request_ping_time = time.time()  # send data to the socket  rawsocket.sendto(imcp_packet, (dst_addr, 80))  return send_request_ping_time, rawsocket, dst_addr   '''  request ping  '''  def request_ping(data_type, data_code, data_checksum, data_ID, data_Sequence, payload_body):  # 把字节打包成二进制数据  imcp_packet = struct.pack('>BBHHH32s', data_type, data_code, data_checksum, data_ID, data_Sequence, payload_body)  icmp_chesksum = chesksum(imcp_packet) # 获取校验和  imcp_packet = struct.pack('>BBHHH32s', data_type, data_code, icmp_chesksum, data_ID, data_Sequence, payload_body)  return imcp_packet  '''  reply ping  '''  def reply_ping(send_request_ping_time, rawsocket, data_Sequence, timeout=2):  while True:    started_select = time.time()    what_ready = select.select([rawsocket], [], [], timeout)    wait_for_time = (time.time() - started_select)    if what_ready[0] == []: # Timeout      return -1    time_received = time.time()    received_packet, addr = rawsocket.recvfrom(1024)    icmpHeader = received_packet[20:28]    type, code, checksum, packet_id, sequence = struct.unpack(      ">BBHHH", icmpHeader    )    if type == 0 and sequence == data_Sequence:      return time_received - send_request_ping_time    timeout = timeout - wait_for_time    if timeout <= 0:      return -1   '''  实现 ping 主机/ip  '''  def ping(host):  data_type = 8 # ICMP Echo Request  data_code = 0 # must be zero  data_checksum = 0 # "...with value 0 substituted for this field..."  data_ID = 0 # Identifier  data_Sequence = 1 # Sequence number  payload_body = b'abcdefghijklmnopqrstuvwabcdefghi' # data  dst_addr = socket.gethostbyname(host) # 将主机名转ipv4地址格式,返回以ipv4地址格式的字符串,如果主机名称是ipv4地址,则它将保持不变  print("正在 Ping {0} [{1}] 具有 32 字节的数据:".format(host, dst_addr))  for i in range(0, 4):    icmp_packet = request_ping(data_type, data_code, data_checksum, data_ID, data_Sequence + i, payload_body)    send_request_ping_time, rawsocket, addr = raw_socket(dst_addr, icmp_packet)    times = reply_ping(send_request_ping_time, rawsocket, data_Sequence + i)    if times > 0:      print("来自 {0} 的回复: 字节=32 时间={1}ms".format(addr, int(times * 1000)))      time.sleep(0.7)    else:      print("请求超时。")  if __name__ == "__main__":  # if len(sys.argv) < 2:  #   sys.exit('Usage: ping.py <host>')  ping('www.baidu.com') # sys.argv[1]二 .python实现ping返回延迟简单版本12345678910111213141516171819from ping3 import ping  def ping_host(ip):  """  获取节点的延迟的作用  :param node:  :return:  """  ip_address = ip  response = ping(ip_address)  print(response)  if response is not None:    delay = int(response * 1000)    print(delay, "延迟")    # 下面两行新增的  ping_host('www.baidu.com')
  • [赋能学习] 使用python连接有kerberos认证的kafka指导
    ## 一、测试环境说明 FusionInsight集群:版本8.0.2 开启安全模式 客户端系统类型:CentOS Linux release 7.6.1810 x86_64位 集群和客户端均位于无法连接互联网的内网环境 ## 二、配置步骤 **本章节所有步骤在客户端节点执行** ### 2.1 配置yum源 已有可用yum源的可忽略2.1章节 1. 上传系统安装镜像文件 CentOS-7.6-x86_64-DVD-1810.iso 到客户端节点,例如/opt目录 2. 将镜像文件挂载到/media目录 ``` mount -o loop /opt/CentOS-7.6-x86_64-DVD-1810.iso /media ``` 3. 配置/etc/yum.repos.d/目录下的repo文件,保证该目录下只有一个以.repo结尾的文件,其内容如下 ``` [base] name=file baseurl=file:///media enabled=1 gpgcheck=0 ``` 4. 配置完毕后检查下yum源,如图执行yum repolist命令 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202012/10/164449p1ncagerkbfi3tjv.png) ### 2.2 安装python3 从python官网下载python3源码包,本例中下载的链接为 https://www.python.org/ftp/python/3.7.8/Python-3.7.8.tgz 将获取的Python-3.7.8.tgz上传到/opt目录下,安装命令如下 ``` yum -y install zlib-devel bzip2-devel openssl-devel openssl-static ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libcap-devel xz-devel libffi-devel lzma gcc cd /opt rm -rf /tmp/Python-3.7.8 tar -zxvf Python-3.7.8.tgz -C /tmp mv /tmp/Python-3.7.8 /usr/local/python-3.7 cd /usr/local/python-3.7/ ./configure --prefix=/usr/local/sbin/python-3.7 make && make install ln -sv /usr/local/sbin/python-3.7/bin/python3 /usr/bin/python3 ln -sv /usr/local/sbin/python-3.7/bin/pip3 /usr/bin/pip3 ``` ### 2.3 安装kafka-python **说明:安装该依赖之前切记不可执行 FusionInsight 客户端环境变量,即不能执行 source /opt/client/bigdata_env** 附件中的安装包都是从pypi官网下载,可直接使用,或者到pypi下载 ***<u>切记:如下依赖包的安装顺序必须是 six > decorator > gssapi > kafka-python</u>*** 1. 获取依赖包,pypi下载链接如下 six https://pypi.org/project/six/#files decorator https://pypi.org/project/decorator/#files gssapi https://pypi.org/project/gssapi/#files kafka-python https://pypi.org/project/kafka-python/#files 2. 安装依赖six ``` tar -zxvf six-1.15.0.tar.gz cd six-1.15.0 python3 setup.py install ``` 3. 安装decorator ``` tar -zxvf decorator-4.4.2.tar.gz cd decorator-4.4.2 python3 setup.py install ``` 4. 安装gssapi ``` tar -zxvf gssapi-1.6.11.tar.gz cd gssapi-1.6.11 python3 setup.py install ``` 5. 安装kafka-python ``` tar -zxvf kafka-python-2.0.2.tar.gz cd kafka-python-2.0.2 python3 setup.py install ``` ### 2.4 安装FusionInsight客户端 本步骤略,客户端安装目录自定义,例如/opt/client ## 三、验证 ### 3.1 执行kerberos认证 参考命令 ``` source /opt/client/bigdata_env kinit -k -t user.keytab developuser ``` ### 3.2 创建python测试脚本,内容参考如下 注意bootstrap_servers和sasl_kerberos_domain_name根据实际环境进行修改 ``` #!/usr/bin/env python3 # coding=utf-8 import time from kafka import KafkaProducer from kafka import KafkaConsumer def kafka_python_producer_main(): producer = KafkaProducer(bootstrap_servers='10.162.26.137:21007', security_protocol='SASL_PLAINTEXT', sasl_mechanism='GSSAPI', sasl_kerberos_service_name='kafka', sasl_kerberos_domain_name='hadoop.hadoop.com', sasl_plain_username='KafkaClient') producer.send('testTopic3', 'kafka python test'.encode('utf-8')) producer.flush() producer.close() print('producer done') def kafka_python_consumer_main(): consumer = KafkaConsumer('testTopic3', bootstrap_servers='10.162.26.137:21007', group_id='kafka-test-20191014', auto_offset_reset='earliest', security_protocol='SASL_PLAINTEXT', sasl_mechanism='GSSAPI', sasl_kerberos_service_name='kafka', sasl_kerberos_domain_name='hadoop.hadoop.com', sasl_plain_username='KafkaClient') for msg in consumer: print(msg.value) print(msg.partition) print('consumer done') if __name__ == '__main__': kafka_python_producer_main() time.sleep(1) kafka_python_consumer_main() ``` 3.3 执行测试脚本,查看执行结果 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202012/10/164828mnus548bykwullyl.png) 通过kafka自带脚本验证结果: ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202012/10/164955yustuehfqtuti1to.png) ## 更多kafka-python使用参考: https://kafka-python.readthedocs.io/en/master/usage.html
  • [技术干货] python的dict判断key是否存在的方法
    大家在学会python中的字典,会发现,字典中是没有特殊顺序的,但是都存储在一个特定的key下面,key是什么呢?其实key是python字典中的键,可以是数字,也可以是字符串,可以存储任意类型的对象。那你知道如何判断字典中key的存在吗?下面小编就向大家介绍python中,判断字典中是否存在key的两种方法。方法一:使用自带函数实现123dict = {'a': {}, 'b': {}, 'c': {}}print(dict.__contains__("b"))     返回:Trueprint(dict.__contains__("d"))     返回:False第二种方法:使用in方法12345#生成一个字典d = {'a':{}, 'b':{}, 'c':{}}#打印返回值,其中d.keys()是列出字典所有的keyprint 'a' in d.keys()print 'a' in d知识点扩展:python 判断dict当中key是否存在的两种方法如果key不存在,dict就会报错:1234>>> d['Thomas']Traceback (most recent call last): File "<stdin>", line 1, in <module>KeyError: 'Thomas'要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:12>>> 'Thomas' in dFalse二是通过dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value:123>>> d.get('Thomas')>>> d.get('Thomas', -1)-1注意:返回None的时候Python的交互式命令行不显示结果。
  • 吹爆这8个Python练手小项目,轻松易学
    知识本质上只是信息,我们最需要的知道的是,学以致用,做到什么程度,才是我们学习的目的所在,所以练手!实干!才是最重要的!以下就是今日推荐的简单好实现练手神器!1. Kaggle 实战之波士顿房价预测友情提示:初学者需要先学习关于数据清理的基本知识,再来接触本项目喔。这个项目将使用Dean de cock在kaggle上发布的波士顿住房数据来完成回归预测。2. Python 语言程序设计实验本项目对于没有编程经验的学生十分友好,也适合那些有其他编程语言基础的同学。它不仅介绍了Python3的基本知识,还介绍了pep8、virtualenv、测试、项目结构和flask。3. 用逻辑回归实现分类这个项目来自Python-Bayesian分析异步社区。主要说明了逻辑回归的基本概念,然后由线性回归扩展到逻辑回归的反向链接函数的概念,利用逻辑回归对虹膜问题进行分类。4. NumPy 百题大冲关Numpy是Python语言的扩展库。它支持浩大的高维数组和矩阵运算,也为数组运算提供了大量的数学函数。在刷题中可以一边学习如何使用numpy,一边巩固numpy的各个知识点,温故知新。5. Seaborn 数据可视化基础入门Seaborn 是基于 Python 且非常受欢迎的图形可视化库,可以实现 Python 环境下的绝大部分探索性分析的任务,在 Matplotlib 的基础上运行,使得作图更加方便快捷。即便是没有什么基础的人,也能通过极简的代码,做出具有分析价值而又十分美观的图形,非常适合数据可视化的研究。6. 爬取豆瓣排行榜电影数据这个项目想法来自于大三某课程设计,平常喜欢看电影,常常需要搜索,但是不知道有哪些评分高的电影。为了方便使用就重新改写了原来的项目。这也是对爬虫技术、可视化技术的一种实践。主要是用排行榜和影片关键词两种方式爬取电影数据。7. 一键生成微信个人专属数据报告每个人应该都想过生成一份属于你的微信个人数据报告,毕竟微信是生活中不可或缺的一份子。我们可以基于python对微信好友进行全方位数据分析,只要你想的到的都有。主要可以统计出你的陌生人、星标好友、不让他看我的朋友圈的好友、不看他的朋友圈的好友数据。以及所有好友在全国的分布,对好友数最多的省份进行进一步分析。猜出你最亲密的好友,找出与你所在共同群聊数最多的好友,对你的好友个性签名进行分析生成关键词云图。目前网上也有很多这类东西,不过本程序的运行十分简单,只需扫码登录一步操作。如何运行:8. AI对对联收藏它你就是现代诗人,对联之王。这个项目基于深度学习技术来实现自动对对联,直接输入上联点击即可获得下联。假如你对内在技术感兴趣,也可以在项目内查看。它更擅长古风的对联比如 :“殷勤怕负三春意 ,潇洒难书一字愁。 ”“如此清秋何吝酒,这般明月不须钱。 ”作者:快快网络来源:今日头条
  • [技术干货] python 实现数据库中数据添加、查询与更新的示例代码(下)
    二、数据批量查询select_data.py123456789101112131415161718192021222324import pymysqlimport pandas as pdimport numpy as np  def get_tags():  # 连接数据库,地址,端口,用户名,密码,数据库名称,数据格式  conn = pymysql.connect(host='xxx.xxx.xxx.xxx',port=3307,user='root',passwd='123456',db='xxxx',charset='utf8')  cur = conn.cursor()  # 表cf_users中获取所有用户id  sql = 'select id from cf_tags where id between 204 and 298'  # 将user_id列转成列表输出  df = pd.read_sql(sql,con=conn)  # 先使用array()将DataFrame转换一下  df1 = np.array(df)  # 再将转换后的数据用tolist()转成列表  df2 = df1.tolist()  # cur.execute(sql)  # data = cur.fetchone()  # print(df)  # print(df1)  # print(df2)  return df2  conn.close()三、批量更新数据select_data.py123456789101112131415161718192021222324import pymysqlimport pandas as pdimport numpy as np  def get_tags():  # 连接数据库,地址,端口,用户名,密码,数据库名称,数据格式  conn = pymysql.connect(host='xxx.xxx.xxx.xxx',port=3307,user='root',passwd='123456',db='xxxx',charset='utf8')  cur = conn.cursor()  # 表cf_users中获取所有用户id  sql = 'select id from cf_tags where id between 204 and 298'  # 将user_id列转成列表输出  df = pd.read_sql(sql,con=conn)  # 先使用array()将DataFrame转换一下  df1 = np.array(df)  # 再将转换后的数据用tolist()转成列表  df2 = df1.tolist()  # cur.execute(sql)  # data = cur.fetchone()  # print(df)  # print(df1)  # print(df2)  return df2  conn.close()
  • [技术干货] python 实现数据库中数据添加、查询与更新的示例代码(上)
    一、前言  最近做web网站的测试,遇到很多需要批量造数据的功能;比如某个页面展示数据条数需要达到10000条进行测试,此时手动构造数据肯定是不可能的,此时只能通过python脚本进行自动构造数据;本次构造数据主要涉及到在某个表里面批量添加数据、在关联的几个表中同步批量添加数据、批量查询某个表中符合条件的数据、批量更新某个表中符合条件的数据等。  二、数据添加  即批量添加数据到某个表中。insert_data.py12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879import pymysqlimport randomimport timefrom get_userinfo import get_userinfofrom get_info import get_infofrom get_tags import get_tagsfrom get_tuser_id import get_utag  class DatabaseAccess():  def __init__(self):    self.__db_host = "xxxxx"    self.__db_port = 3307    self.__db_user = "root"    self.__db_password = "123456"    self.__db_database = "xxxxxx"  # 连接数据库  def isConnectionOpen(self):    self.__db = pymysql.connect(      host=self.__db_host,      port=self.__db_port,      user=self.__db_user,      password=self.__db_password,      database=self.__db_database,      charset='utf8'    )     # 插入数据  def linesinsert(self,n,user_id,tags_id,created_at):      self.isConnectionOpen()    # 创建游标    global cursor    conn = self.__db.cursor()    try:      sql1 = '''      INSERT INTO `codeforge_new`.`cf_user_tag`(`id`, `user_id`,       `tag_id`, `created_at`, `updated_at`) VALUES ({}, {},       {}, '{}', '{}');      '''.format(n,user_id,tags_id,created_at,created_at)             # 执行SQL        conn.execute(sql1,)    except Exception as e:      print(e)    finally:      # 关闭游标      conn.close()      self.__db.commit()             self.__db.close()     def get_data(self):         # 生成对应数据 1000条    for i in range(0,1001):      created_at = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())      # print(create_at)      # 用户id      tuserids = []      tuserid_list = get_utag()      for tuserid in tuserid_list:        tuserids.append(tuserid[0])      # print(tuserids)      userid_list = get_userinfo()      user_id = random.choice(userid_list)[0]      if user_id not in tuserids:        user_id=user_id               # 标签id        tagsid_list = get_tags()        tags_id = random.choice(tagsid_list)[0]        self.linesinsert(i,user_id,tags_id,created_at)  if __name__ == "__main__":  # 实例化对象  db=DatabaseAccess()  db.get_data()
  • [技术干货] Python常用GUI框架原理解析汇总
    Graphical User Interface,简称 GUI,又称图形化用户接口,所谓的GUI编程,指的是用户不需要输入代码指令,只通过图形界面的交互就可以操作软件功能。Tkinter一个轻量级的跨平台图形用户界面(GUI)开发工具,是Python的自带的官方标准库,安装Python 之后直接导入就可以使用, 我们常见的python IDLE就是使用TKinter实现。它最大的特点就是上手简单, 做个简单的小工具基本够用了,比如登录,计算器,简单的输入输出工具等,缺点是不够美观,功能太单一。PyqtQT是一个C ++编写的跨平台的框架。这是一个非常全面的库。1991年奇趣科技公司开发的C++ GUI应用程序,2014年发布了Qt5.3正式版。PyQt是Qt库的Python版本,它有超过300类,将近6000个函数和方法。它是一个多平台的工具包,可以运行在所有主要操作系统上,包括UNIX,Windows和Mac。PyQt采用双许可证,开发人员可以选择GPL和商业许可。在此之前,GPL的版本只能用在Unix上,从PyQt的版本4开始,GPL许可证可用于所有支持的平台。QT带来的最大好处就是它有一个QT Desiginer,这个设计器可以方便我们进行页面的布局,可以说在Tkinter里面需要一坨坨的代码完成的页面布局,在QT里面只要拖一拖控件就搞定了。wxPythonwxPython 是一款开源软件,是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的、功能健全的 GUI 用户界面。wxPython开源免费,支持LINUX和WINDOWS,界面本地化好, 功能完善,它也提供类似QT Designer的设计器wxFormbuilder,可以说是个压缩版的QT。PySide使用“C++”语言编写的应用程序/用户界面(UI)框架。“PySide”是“Qt”的封装。与PySide的不同之处在于PyQt可以商用。PyGUI减少Python应用与平台底层GUI之间的代码量,面向Unix,Macintosh和Windows平台。Kivy基于OpenGL ES 2,能够让使用相同源代码创建的程序能跨平台运行。这个框架是事件驱动的,基于主循环,非常适合开发游戏。Kivy拥有能够处理动画、缓存、手势、绘图等功能。它还内置许多用户界面控件如:按纽、摄影机、表格、Slider和树形控件等。PyGTK -GTK在Linux中常用的“GTK+”是“PyGTK”的“GTK +”封装。与Kivy和PyQt相比,它能不加修改的稳定运行在各种操作系统之上,如Linux,Windows,MacOS等。Flexx许多Python GUI库基于以其他语言编写的库,例如用C++编写的库有wxWidgets和libavg。但Flexx是用Python创建的,使用Web技术,也正因为如此 Flexx 是跨平台的。只需要有 Python 和浏览器就可以运行CEF Python基于Google Chromium,面向Windows,MAC OS和Linux,其主要用于在第三方应用程序中嵌入式浏览器的使用上Dabo一个跨平台的应用程序开发框架,基于wxpython的再封装库。它提供数据库访问,商业逻辑以及用户界面Pyforms一个用于开发GUI应用程序的Python 2.7 / 3.x跨环境运行框架。PyGObject可以为GNOME项目编写Python应用程序,你也可以使用GTK +编写Python应用程序。关于框架的选择,没有最好的,只有最适合的。其他框架的具体使用和介绍,可以查看官方文档学习:https://wiki.python.org/moin/GuiProgramming
  • [技术干货] python中二分查找法的实现方法
    如果想要在有序数据中进行查找想要的数据,二分查找法就个好方法,它可以大大缩短了搜索时间,是一种常见的查找方法。二分查找很好写,却很难写对,下面,小编就简单向大家介绍一下二分查找,并演示器使用代码。1、二分查找在一个有序并且无重复的列表中,对该列表的元素进行查找。2、特点(1)必须针对于有序列表(2)该列表必须无重复(3)按下标索引查找3、使用方法非递归实现:12345678910111213141516171819def binary_search(alist, item):  """二分查找 非递归方式"""  n = len(alist)  start = 0  end = n - 1  while start <= end:    mid = (start + end) // 2    if alist[mid] == item:      return True    elif item < alist[mid]:      end = mid - 1    else:      start = mid + 1  return False if __name__ == '__main__':  li = [17, 20, 26, 31, 44, 54, 55, 77, 93]  # print(binary_search(li, 55))  # print(binary_search(li, 100))递归实现:12345678910111213141516def binary_search_2(alist, item):  """二分查找 递归方式"""  n = len(alist)  if 0 == n:    return False  mid = n // 2  if alist[mid] == item:    return True  elif item < alist[mid]:    return binary_search_2(alist[:mid], item)  else:    return binary_search_2(alist[mid + 1:], item)if __name__ == '__main__':  li = [17, 20, 26, 31, 44, 54, 55, 77, 93]  # print(binary_search(li, 55))  # print(binary_search(li, 100))基础知识点扩展:介绍二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。前提必须待查找的序列有序时间复杂度O(log2n)原理1)确定该期间的中间位置K2)将查找的值t与array[k]比较,若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。3)区域确定过程:若array[k]>t,由于数组有序,所以array[k,k+1,……,high]>t;故新的区间为array[low, ..., K-1];反之,若array[k]<t对应查找区间为array[k+1, ..., high]
总条数:2474 到第 页
上滑加载中