首页 文章 精选 留言 我的

精选列表

搜索[自动化工具],共10000篇文章
优秀的个人博客,低调大师

python自动化办公:玩转word之页眉页脚秘笈

节将就python操作word的页眉页脚技巧做深入介绍。 使用页眉和页脚 python操作word的页眉页脚技巧做深入介绍 Word支持页眉和页脚。页眉是出现在每个页面的上边距区域中的文本,与文本主体分开,并且通常传达上下文信息,例如文档标题,作者,创建日期或页码。文档中的页眉在页面之间是相同的,内容上只有很小的差异,例如更改部分标题或页码。页眉也称为运行头。 一个页面页脚中的每个日日夜夜,只不过它出现在页面底部的页头类似。它不应与脚注混淆,脚注在页面之间不一致。为了简洁起见,这里经常使用术语标题来指代可以是页眉或页脚对象的内容,信任读者以理解它对两种对象类型的适用性。 访问节的标题 页眉和页脚与一个部分相关联; 这允许每个部分具有不同的页眉和/或页脚。例如,横向部分可能具有比纵向部分更宽的标题。 每个section对象都有一个.header属性,提供对该节的对象的访问: >>>document = Document() >>>section = document.sections[0] >>>header = section.header >>>header <docx.section._Header object at 0x...> 甲目的是总是存在于Section.header,即使当没有报头该节限定。实际标头定义的存在表示为_Header.is_linked_to_previous: >>>header.is_linked_to_previous True 值为True表示对象不包含标题定义,该节将显示与上一节相同的标题。这种"继承"行为是递归的,因此"链接"标题实际上从具有标题定义的第一个前一部分获得其定义。此"链接"状态在Word UI中显示为"与以前相同"。 新文档没有标题(在它包含的单个部分),因此 .is_linked_to_previous就是True这种情况。请注意,这种情况可能有点违反直觉,因为没有要链接的前一个节头。在此"无前一个标题"的情况下,不显示标题。 添加标题(简单情况) 只需编辑 对象的内容即可将标题添加到新文档中。一个对象是一个"故事"容器及其内容进行编辑,就像一个对象。请注意,与新文档一样,新标题已包含单个(空)段落: >>>paragraph = header.paragraphs[0] >>>paragraph.text = "Title of my document" 添加内容(甚至只是访问header.paragraphs)的行为添加了标头定义并 另请注意,添加内容(甚至只是访问header.paragraphs)的行为添加了标头定义并更改了以下状态.is_linked_to_previous: >>>header.is_linked_to_previous False 添加"分区"标题内容 具有多个"区域"的标题通常使用精心放置的制表位来完成。中心和右对齐"区域"所需的制表位是HeaderWord中潜在样式的一部分 ,但该样式不存在于默认python-docx 模板中,需要添加: >>> fromdocx.enum.styleimportWD_STYLE_TYPE >>> fromdocx.enum.textimportWD_TAB_ALIGNMENT >>>styles = document.styles >>>style = styles.add_style("Header", WD_STYLE_TYPE.PARAGRAPH) >>>style.base_style = styles["Normal"] >>>tab_stops = style.paragraph_format.tab_stops >>>tab_stops.add_tab_stop(Inches(3.25), WD_TAB_ALIGNMENT.CENTER) >>>tab_stops.add_tab_stop(Inches(6.5), WD_TAB_ALIGNMENT.RIGHT) 如果您使用的是自定义模板而不是python-docx默认模板,那么在模板中定义该样式可能是有意义的。 一旦Header式存在时,突片用于分离左,中和右对齐头内容: >>>paragraph = header.paragraphs[0] >>>paragraph.text = "Left Text Center Text Right Text" >>>paragraph.style = document.styles["Header"] 突片用于分离左,中和右对齐头内容: 删除标题 可以通过分配True其 .is_linked_to_previous属性来删除不需要的标头: >>>header.is_linked_to_previous =True >>>header.is_linked_to_previous True True分配给 标题时,标题的内容将被不可逆转地删除.is_linked_to_previous。 理解多节文档中的标题 "刚开始编辑"方法适用于简单的情况,但为了理解多节文档中的标题行为,一些简单的概念将有所帮助。简而言之: 1. 每个部分都可以有自己的标头定义(但不必)。 2. 缺少标头定义的部分会继承之前部分的标头。当存在定义而不存在_Header.is_linked_to_previous定义时,该属性仅反映标头定义的False存在True。 3. 缺少标头定义是默认状态。新文档没有已定义的标题,也没有新插入的部分。.is_linked_to_previous报告 True这两种情况。 4. 如果_Header对象的内容具有标题定义,则它是自己的内容。如果不是,它的内容是第一现有节的不具有标题的定义。如果没有节具有标题定义,则在第一节中添加新节,并且所有其他节继承该节。这种添加标头定义是在第一次访问标头内容时发生的,可能是通过引用 header.paragraphs。 添加标题定义(一般情况) 可以通过赋予False其.is_linked_to_previous属性来为缺少一个节的节提供显式标头定义 : >>>header.is_linked_to_previous True >>>header.is_linked_to_previous =False >>>header.is_linked_to_previous False 新添加的标头定义包含一个空段落。请注意,以这种方式保留标题偶尔会有用,因为它有效地"关闭"该部分的标题以及之后的标题,直到具有已定义标题的下一部分。 分配False给.is_linked_to_previous已具有标头定义的标头不会执行任何操作。 自动定位继承的内容 编辑标题的内容会编辑源标题的内容,同时考虑任何"继承"。因此,例如,如果第2节标题继承自第1节并且您编辑第2节标题,则实际上更改了第1节标题的内容。除非您首先明确指定False其.is_linked_to_previous属性,否则不会为第2节添加新的标头定义。

优秀的个人博客,低调大师

zabbix自动化线上实战--Zabbix lld发现磁盘监控

Zabbix3.0入门到生产环境应用实战: http://www.roncoo.com/course/view/fb3050a5b34b42f39ccad83ebebc89c1 一、软件版本 操作系统:CentOS-6.5-x86_64 zabbix版本:3.0.3 二、脚本编写: 1、python版本: #!/usr/bin/env python import json import subprocess def get_disk(): cmd = """grep -E "(vd[a-z]$|sd[a-z]$)" /proc/partitions|awk '{print $4}'""" disk_data = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) disk_total = [] disktotal_dict = {"data":None} for dev in disk_data.stdout.readlines(): disk_dict = {} disk_dict["{#DISKNAME}"]=dev.strip("\n").strip() disk_total.append(disk_dict) disktotal_dict["data"]=disk_total jsonstr = json.dumps(disktotal_dict, sort_keys=True, indent=4) return jsonstr if __name__ == "__main__": print get_disk() 2、shell脚本版本: #!/bin/bash disk_array=(`grep -E "(vd[a-z]$|sd[a-z]$)" /proc/partitions|awk '{print $4}'`) length=${#disk_array[@]} printf "{\n" printf '\t'"\"data\":[" for ((i=0;i<$length;i++)) do printf '\n\t\t{' printf "\"{#DISKNAME}\":\"${disk_array[$i]}\"}" if [ $i -lt $[$length-1] ];then printf ',' fi done printf "\n\t]\n" printf "}\n" 三、key的查看解析:主要 /proc/diskstats文件读取: 1、读取具体文件解析: [root@BJ-monitor-h-01 ~]# cat /proc/diskstats | grep sda 8 0 sda 844141 181483 43038400 10926021 147765030 3756991779 31237698668 4206792245 0 52927059 4217644644 ##每一项解读: 844141 181483 43038400 10926021 147765030 3756991779 31237698668 4206792245 0 52927059 4217644644 第一个区域:读完成次数 ----- 读磁盘的次数,成功完成读的总次数。 第二个区域:合并读完成次数, 第6个域:合并写完成次数。为了效率可能会合并相邻的读和写。从而两次4K的读在它最终被处理到磁盘上之前可能会变成一次8K的读,才被计数(和排队),因此只有一次I/O操作。这个域使你知道这样的操作有多频繁。 第3个域:读扇区的次数,成功读过的扇区总次数。 第4个域:读花费的毫秒数,这是所有读操作所花费的毫秒数 第5个区域:写完成次数 ----写完成的次数,成功写完成的总次数。 第6区域:合并写完成次数 -----合并写次数。 第7个域:写扇区次数 ---- 写扇区的次数,成功写扇区总次数。 第8个域:写操作花费的毫秒数 --- 写花费的毫秒数,这是所有写操作所花费的毫秒数 第9个域:正在处理的输入/输出请求数 -- -I/O的当前进度,只有这个域应该是0。当请求被交给适当的request_queue_t时增加和请求完成时减小。 第10个域:输入/输出操作花费的毫秒数 ----花在I/O操作上的毫秒数,这个域会增长只要field 9不为0。 第11个域:输入/输出操作花费的加权毫秒数 ----- 加权, 花在I/O操作上的毫秒数,在每次I/O开始,I/O结束,I/O合并时这个域都会增加。这可以给I/O完成时间和存储那些可以累积的提供一个便利的测量标准。 2、编写agnet key的几个监控项目: UserParameter=custom.vfs.dev.read.ops[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$4}' ###读磁盘完成的次数 UserParameter=custom.vfs.dev.read.ms[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$7}' ###读花费的毫秒数 UserParameter=custom.vfs.dev.write.ops[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$8}' ###写完成的次数 UserParameter=custom.vfs.dev.write.ms[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$11}' ###写操作花费的毫秒数 UserParameter=custom.vfs.dev.io.active[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$12}' ###当前的IO情况 UserParameter=custom.vfs.dev.io.ms[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$13}' ###花在I/O操作上的毫秒数 UserParameter=custom.vfs.dev.read.sectors[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$6}' ##读取扇区次数 UserParameter=custom.vfs.dev.write.sectors[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$10}' ##写扇区次数 关注微信:

优秀的个人博客,低调大师

单元测试代码自动化生成解决方案

写在前面的话: 鄙人星云,今年六月份,刚到北京入职了一家国企,由于刚进项目对现有的项目业务还不是很熟悉,但是领导已经下了命令,要我给现有的项目写单元测试代码,项目比较大,业务还不熟悉,如果全部手写测试代码,必然是个累死人不偿命的事情。 那么有没有更好的解决方案呢?答案自然是肯定的。 解决方案: 通过查询资料得知,在码农界有这样一个Eclipse插件——CodePro Analytix,通过这个插件可以自动批量生成单元测试代码。 CodePro Analytix是一个基于Eclipse的快速开发环境,能够自动的完成重复的任务使Java开发者快速的开发出高质量的软件。能够保证代码质量,包括代码评审、metric、设计模式、测试,等等 使用指南: CodePro Analytix 插件下载 下载后解压到一个路径下,路径中最好不要有中文。解压后像这样: 打开你的Eclipse IDE 我用的IDE是STS——Spring 官方推出的Eclipse发行版。 Help------> Install new Software 5.Work With: --------> add... ------->Local...浏览找到刚才解压的路径6.选中这三个选项,然后一步一步安装即可7.安装完成后重启下你的Eclipse 即可。8.修改配置 Windows------> Perference ——————Code Pro ------->JUnit ----->Generated Code默认是这样的: 但是一般我们需要修改下才符合我们常规的使用 10.最后选中项目中的源码文件或者源码文件夹或项目名,右键------>Code Pro Tools----->Generate Test Case即可这样,批量的单元测试代码就生成了。 接下来讲解一些注意事项: 关于JUnit报initializationError的解决方法 <!-- https://mvnrepository.com/artifact/org.hamcrest/hamcrest-core --> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <version>1.3</version> <scope>test</scope> </dependency> 2.关于一些莫名奇妙无法处理的异常处理比如莫名奇妙的空指针异常,可以在测试注解中添加这个值 @Test(expected = java.lang.NullPointerException.class) 或者如果有其他的异常类似这个: @Test(expected = org.apache.axiom.om.OMException.class) public void testSerialize_1() throws Exception { PostEvent fixture = new PostEvent(); fixture.setEventName(""); fixture.setEventData(""); fixture.localEventNameTracker = true; fixture.localEventDataTracker = true; QName parentQName = new QName(""); OMFactory factory = new OMLinkedListImplFactory(); MTOMAwareXMLStreamWriter xmlWriter = new MTOMAwareOMBuilder(); fixture.serialize(parentQName, factory, xmlWriter); // add additional test code here // An unexpected exception was thrown in user code while executing this test: // org.apache.axiom.om.OMException: localname can not be null or empty // at org.apache.axiom.om.impl.llom.OMElementImpl.<init>(OMElementImpl.java:135) // at org.apache.axiom.om.impl.llom.OMElementImpl.<init>(OMElementImpl.java:118) // at org.apache.axiom.om.impl.llom.factory.OMLinkedListImplFactory.createOMElement(OMLinkedListImplFactory.java:75) // at org.apache.axis2.databinding.utils.writer.MTOMAwareOMBuilder.writeStartElement(MTOMAwareOMBuilder.java:101) // at org.apache.axis2.databinding.utils.writer.MTOMAwareOMBuilder.writeStartElement(MTOMAwareOMBuilder.java:92) // at com.travelsky.dcsi.PostEvent.serialize(PostEvent.java:178) // at com.travelsky.dcsi.PostEvent.serialize(PostEvent.java:151) } 看到这样的信息就添加注解: @Test(expected = org.apache.axis2.databinding.ADBException.class) 关于断言测试常用的几种用法: //如果result不为空返回true测试通过 assertNotNull(result); //第一个参数是期待结果,第二个是实际的引用对象 assertEquals(true, result.hasNext()); //支持多种数据类型 assertEquals(2, result.next()); //期待结果是null 接受一个引用对象参数 assertNull(result) 本篇完~ 交流即分享,分享才能进步! 不对之处,还请各位前辈多多指教。 by 星云 *

优秀的个人博客,低调大师

Python自动化开发学习13-堡垒机开发

堡垒机介绍 很多人觉得,堡垒机就是跳板机,这是不全面的。跳板功能只是堡垒机所具备的功能的其中一项。堡垒机还有以下两个至关重要的功能: 权限管理 : 用户使用堡垒机账号登录堡垒机系统。不需要知道别的主机的账号和密码,都是由堡垒机系统管理的。用户可以登录的主机和每台主机上所拥有的权限也是由堡垒机系统管理的。 审计管理 : 用户的所有操作都是在堡垒机上执行的,所以都会被记录保存。其实对于操作的结果(就是屏幕上打印的结果),如果需要也是可以记录保存的。不过一般不那么做,而且数据量也会有点大。 开源堡垒机项目 号称没有好的开源项目,因为底层的SSH还是通过paramiko模块的长链接的ssh实现的。但是这个和原生的ssh比还是不太稳定,不太好用。不适合生产环境。要好用还是得去改原生的ssh,但是我们不会,我们只会改python。总之这章就是实现一个堡垒机的功能,真要做个好用的以后再说吧。比较有名的大概是这个:jumpserver - 开源跳板机 paramiko模块的长连接 虽然上面说了,用这个模块不稳定,但是我们也没办法,毕竟只会这个。paramiko之前已经学习过了,不过当时用的都是短连接。即:连接一次,执行一条命令,返回结果,断开。这里我们要用长连接。长连接的代码在demos文件夹下的demo.py这个文件里,另外还要用到interactive.py这个文件。安装模块的时候不安装这个demos文件夹,所以我们去github上下下来:https://github.com/paramiko/paramiko/tree/master/demos利用demo.py程序,我们可以进行ssh的长连接。下面的开发都是基于这个程序为基础,在这个程序的基础上,修改该程序的源码添加上记录用户输入的代码,并写入数据库。于是审计管理便实现了。 堡垒机构架 任何人只能通过堡垒机登录设备,堡垒机可以链接管理所有的设备: 配置环境变量 还需要确保用户一登录堡垒机就进入你的程序,并且不能退出(一退出就退出整个堡垒机),就是只能在你的做的shell下运行,不能进入原生的shell。可以通过设置环境变量实现:环境变量保存在这里: ~/.bashrc,修改文件在最后加上这句: python3 /etc/myJunpServer.py 直接运行你的程序。首次设置完成后如果要让它立刻生效,可以执行这个命令:source .bashrc 加载最新的配置。 表结构设计 主机表: id 主机名 端口号 注释 自增id IP或域名 数值类型,默认22 注释信息 主机认证表: id 名称 用户名 密码 注释 自增id 唯一约束 用户名 明文的字符串 注释信息 主机认证绑定表(分别和主机表以及主机认证表建立一对一关联): 这张就是主机表和主机认证表的多对多关联的结合表,原本不需要单独建立的。但是这张表多加了一个自增id,id还需要去分别和账号表以及群组表建立多对多关联。总之,这样操作是可以实现的,也没有或者说不会3张表之间建立多对多关联的方法,实际试了一下也确实没实现,暂时只会这么搞。主机id 和 认证id 要做联合唯一 id 主机id 认证id 自增id 关联主机表的id 关联主机认证表的id 主机群组表(和主机认证绑定表多对多关联,和账号表多对多关联): 不同的群组里可能包含相同的机器,但是不同群组中同一台机器对应的权限可能不同。所以这里直接关联主机与认证的一条绑定关系。 id 群组名 备注 自增id 唯一 备注信息 堡垒机账号表(和主机认证绑定表多对多关联,和主机群组表多对多关联): id 用户名 密码 自增id 唯一约束 加密存储 审计日志记录表: 通过绑定表的id,可以查询到关联的主机和关联的认证信息 id 时间 用户id 绑定表id 操作消息 自增id 操作时间 关联账号表的id 关联绑定表的id 操作内容 创建表结构的代码如下: from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Enum, DateTime from sqlalchemy import ForeignKey, Table, UniqueConstraint from sqlalchemy.orm import relationship engine = create_engine("mysql+pymysql://admin:admin123@192.168.3.103/week12", encoding='utf-8', echo=True) Base = declarative_base() group_to_bind = Table('group_to_bind', Base.metadata, Column('group_id', Integer, ForeignKey('host_group.id')), Column('bind_host_id', Integer, ForeignKey('bind_host.id')), ) # 主机群组和绑定表的结合表 user_to_bind = Table('user_to_bind', Base.metadata, Column('user_id', Integer, ForeignKey('user.id')), Column('bind_host_id', Integer, ForeignKey('bind_host.id')), ) # 用户和绑定表的结合表 user_to_group = Table('user_to_group', Base.metadata, Column('user_id', Integer, ForeignKey('user.id')), Column('group_id', Integer, ForeignKey('host_group.id')) ) # 用户和群组的结合表 class Host(Base): """主机表 主机名:联合唯一,IP地址或域名 端口号:联合唯一,默认22 注释: """ __tablename__ = 'host' id = Column(Integer, primary_key=True) hostname = Column(String(32), nullable=False) port = Column(Integer, server_default='22') description = Column(String(32)) __table_args__ = (UniqueConstraint('hostname', 'port', name='hostname_port'),) class Authentication(Base): """认证表 用户名: 密码:明文的设备密码 注释: """ __tablename__ = 'authentication' id = Column(Integer, primary_key=True) authname = Column(String(32), nullable=False, unique=True) username = Column(String(32), nullable=False) password = Column(String(32), nullable=False) description = Column(String(32)) class BindHost(Base): """主机和认证绑定表 分别和主机id 以及 认证id 联立一对一关联 主机id 和 认证id 要做联合唯一 """ __tablename__ = 'bind_host' id = Column(Integer, primary_key=True) host_id = Column(Integer, ForeignKey('host.id')) auth_id = Column(Integer, ForeignKey('authentication.id')) __table_args__ = (UniqueConstraint('host_id', 'auth_id', name='host_auth'),) host = relationship('Host', backref='bind_host') auth = relationship('Authentication', backref='bind_host') class HostGroup(Base): """主机群组表 群组名:唯一 注释: """ __tablename__ = 'host_group' id = Column(Integer, primary_key=True) groupname = Column(String(32), nullable=False, unique=True) description = Column(String(32)) bind_host = relationship('BindHost', secondary=group_to_bind, backref='host_group') class User(Base): """用户账号表 用户名:不唯一 密码:sha256的hexdigest(),需要64位 """ __tablename__ = 'user' id = Column(Integer, primary_key=True) username = Column(String(32), nullable=False, unique=True) password = Column(String(64), nullable=False) host_group = relationship('HostGroup', secondary=user_to_group, backref='user') bind_host = relationship('BindHost', secondary=user_to_bind, backref='user') class Audit(Base): """审计日志表""" __tablename__ = 'audit' id = Column(Integer, primary_key=True) time = Column(DateTime) user_id = Column(Integer, ForeignKey('user.id')) bind_id = Column(Integer, ForeignKey('bind_host.id')) msg = Column(String(255)) user = relationship('User', backref='audit') bind_host = relationship('BindHost', backref='audit') Base.metadata.create_all(engine) # 创建所有表结构 __all__ = ['Host', 'Authentication', 'BindHost', 'HostGroup', 'User', 'Audit' ]

优秀的个人博客,低调大师

接口自动化测试PHPUnit-框架代码开发1

经过上一篇的架构设计之后,我们就要开始编写代码了,因为涉及代码较多,所以将分多次进行讲解。 先看一张整体结构图 今天我们先来看看testcase文件里的编写。此处我们以之前的老黄历接口为例。 lhl_test.php内容如下: <?php //代码获取点击链接加入QQ群 522720170:https://jq.qq.com/?_wv=1027&k=5C08ATe //引入一些必要的文件,暂时别管,后面会说到 require_once("../commons/require.php"); use PHPUnitFrameworkTestCase; class LhlTest extends TestCase { //测试用例必须以 test 开头,否则 phpunit 不识别 public function testLhl() { //选择运行环境。此处把host配置到了文件中,直接读取文件内容 $rc=new ReadConfig(); $url=$rc->get_host("online") ; echo $url; //拼接完整的请求串 $get_params="date=2017-11-11&key=填写你申请的key"; $url=$url."?".$get_params; $content=Transfer::get($url); //对返回的json结果进行编码,也就是转换为php可以认识的对象,方便后续使用 $data= json_decode($content,true); print_r($data); if(is_null($data)==false) { //断言,如果返回的error_code为0说明接口成功 $this->assertEquals('0',$data['error_code'],"failed"); print("successed"); } } } ?> 本文转自 小强测试帮 51CTO博客,原文链接:http://blog.51cto.com/xqtesting/1982675,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册