longgin、sys、os、commands模块

  • longgin
  • 日志是我们排查问题的关键利器,写好日志记录,当我们发生问题时,可以快速定位代码范围进行修改。Python有给我们开发者们提供好的日志模块logging

    #从上往下日志级别一级级升高 debug ->info->warning->error->critica

    import loggin
    logging.debug('this is debug')
    logging.info('this is info message')
    logging.warning('this is warning')
    logging.error('this is error')
    logging.critical('this is critical')
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    WARNING:root:this is warning 
    ERROR:root:this is error 
    CRITICAL:root:this is critica

    我们写了三句话,但是在屏幕上只打印了一个warning级别的日志,这个是怎么回事呢? 
    默认情况下,logging将日志打印到屏幕,日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别。 
    ● DEBUG:详细的信息,通常只出现在诊断问题上。 
    ● INFO:确认一切按预期运行 
    ● WARNING:一个警告,可能会有一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”)。这个软件还能按预期工作 
    ● ERROR:个更严重的问题,软件没能执行一些功能 
    ● CRITICAL:一个严重的错误,这表明程序本身可能无法继续运行 
    而默认logging默认的日志级别是info,一般基本上所有的程序都是这个级别,有助于我们排查问题,但是当发生问题,我们没法定位到问题,很多情况下我们需要把日志级别提升到debug级别,那又怎么办呢?

    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',datefmt=' %Y/%m/%d %H:%M:%S', filename='myapp.log', filemode='w')
    logger = logging.getLogger(__name__)
    logging.debug('This is debug message')
    logging.info('This is info message')
    logging.warning('This is warning message')
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结果:在当前目录创建了一个myapp.log的文件 
    文件内容为: 
    2017/11/09 23:13:48 longging.py[line:16] DEBUG This is debug message 
    2017/11/09 23:13:48 longging.py[line:17] INFO This is info message 
    2017/11/09 23:13:48 longging.py[line:18] WARNING This is warning message

    主要是通过logging.basicConfig函数进行操作,现在我们来介绍一下该函数参数的用法: 
    level: 设置日志级别,默认为logging.WARNING 
    filename: 指定日志文件名。 
    filemode: 和file函数意义相同,指定日志文件的打开模式,’w’或’a’ 
    format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示: 
    %(levelname)s: 打印日志级别名称 
    %(filename)s: 打印当前执行程序名 
    %(funcName)s: 打印日志的当前函数 
    %(lineno)d: 打印日志的当前行号 
    %(asctime)s: 打印日志的时间 
    %(thread)d: 打印线程ID 
    %(process)d: 打印进程ID 
    %(message)s: 打印日志信息 
    datefmt: 指定时间格式,同time.strftime() 
    stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略 
    logging.getLogger([name]):创建一个日志对象:

    返回一个logger实例,如果没有指定name,返回root logger。只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是一一对应的。这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到同一个logger实例。 
    logging.getLogger(name) 在上述实例中name就指的是main




  • sys模块
  • sys模块其实有很多功能的,那我们就介绍一些最常用的一些功能吧,这样对于大家来说更加容易上手:

    #这里的argv[0]  argv[1]   相当于shell中的 $1 $2
    import sys
    print('argv[0] = {0}     argv [1] = {1}'.format(sys.argv[0], sys.argv[1]))
      
      
    • 1
    • 2
    • 3

    在cmd下 
    D:\pyProject\class>python sys_Deno.py -i 1.txt

    argv[0] = sys_Deno.py argv [1] = -i

    和其他语言一样,python的sys模块默认是把第一个参数默认是程序本身,从第二个参数起都是代码后面跟着的参数,通过sys.arg[n]就可以获得传入到程序中的参数。

    如果要在pycharm中实现上面效果。需要点击Edit Configurations..这个按钮 
    在Script parameters中输入参数

    这里写图片描述

    sys.stdin\stdout\stderr

    功能:stdin , stdout , 以及stderr 变量包含与标准I/O 流对应的流对象. 如果需要更好地控制输出,而print 不能满足你的要求, 它们就是你所需要的. 你也可以替换它们, 这时候你就可以重定向输出和输入到其它设备( device ), 或者以非标准的方式处理它们

    以下两行在事实上等价: 
    import sys 
    sys.stdout.write(‘hello’+’\n’) 
    print ‘hello’

    sys.stdin 与 raw_input

    name = raw_input('please input you name: ')
    print ('hello ' + name)
    #不支持在()里面写入字符串
    address =sys.stdin.readline()
    print ('you address is '+address)
      
      
    • 1
    • 2
    • 3
    • 4
    • 5

    从控制台重定向到文件

    f = open('1.log','w')
    sys.stdout=f
    print 'hello'
    f.close()
      
      
    • 1
    • 2
    • 3
    • 4

    在当前文件下新生成一个文件1.log,文件内容为hello,

    捕获sys.exit(n)调用

    功能:执行到主程序末尾,解释器自动退出,但是如果需要中途退出程序,可以调用sys.exit函数,带有一个可选的整数参数返回给调用它的程序,表示你可以在主程序中捕获对sys.exit的调用。(0是正常退出,其他为异常)

    def exitfunc():
        print "hello world"
        # 设置捕获时调用的函数
    sys.exitfunc = exitfunc
    print "aaaaaaaa"
    # 退出自动调用exitfunc()后,程序依然退出了
    sys.exit(1)
    # 不会被 print
    print "there"
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    aaaaaaaa 
    hello world

    设置sys.exitfunc函数,及当执行sys.exit(1)的时候,调用exitfunc函数 
    sys.exit(1)后面的内容就不会执行了,因为程序已经退出。


  • commands模块
  • os模块也是我们平时工作中很常用到的一个模块,通过os模块调用系统命令,获得路劲,获取操作系统的类型等都是使用该模块。下面我们就了解一下os模块

    通过os获取系统类型

    import os
    print(os.name)
      
      
    • 1
    • 2

    如果是windows系统,os.name = ‘nt’ 
    如果是linux系统os.name = ‘posix’

    不同的操作系统是命令可能不一样。所以在使用系统命令之前,我们先要判断系统是linux系统还是windows系统

    import os
    #os.system(‘ifconfig’)只会调用系统的命令,是当我们需要获得系统命令最后的执行结果
    os.system('ipconfig')
    #os.popen()返回的是一个file对象,我们可以通过file.read()来获得最后系统命令最终的结果
    content = os.popen('ipconfig').read()
    print (content)
    
    #找到这个ip的位置
    print (content.find('192.168.0.109'))
    
    #显示当前路径
    print(os.getcwd())
    #获取当前目录文件
    print(os.listdir('.'))
    #切换目录
    os.chdir(r'f:')
    
    #在当前目录下创建abc目录
    #os.mkdir('abc')
    #删除当前目录下的1.txt文件,(如果文件不存在会报错)
    #os.remove('1.txt')
    #打印操作系统的分隔符,linux系统的分隔符\n,windows系统的分隔符\r\n,
    print(os.linesep)
    
    #目录拼接但不会创建
    print(os.path.join(os.getcwd(), 'abc.txt'))
    #把最后文件和目录分开# ('F:', 'abc.txt')
    path1 = os.path.join(os.getcwd(), 'abc.txt')
    print(os.path.split(path1))
    #把目录和后缀名分开
    print (os.path.splitext(path1))
    ##当前目录下存在aaa目录,不创建,当前不存在aaa目录,创建aaa目录
    if not os.path.exists(r'F:\abc\aaa'):
        os.mkdir(r'F:\abc\aaa')
    #获得E:\test\test.py文件的目录
    print(os.path.dirname(r'E:\test\test.py'))
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    1, os.getcwd() 获得目录的当前系统程序工作路径 
    2, os. chdir(‘目标目录’) 切换到目标目录 
    3, os.listdir(‘字符串目录’) 列出字符串目录下的所有文件 
    4, os.mkdir(‘目录’) 创建目录 
    5, os.remove(‘1.txt’) 删除文件,文件不存在时会报错 
    6, os.linesep 打印操作系统的分隔符,linux系统的分隔符\n,windows系统的分隔符\r\n,mac系统的分隔符\r 
    7, os.path.join(os.getcwd(), ‘aaa’, ‘bbb’, ‘ccc’) 拼接出来多级目录:E:\test\aaa\bbb\ccc 
    8, os.path.exists(‘目录’) 判断目录是否存在 
    9, os.path.split(‘文件或者目录’) 把最后的一个目录或者文件和前面的目录分开,返回一个tuple 
    10,os.path.splitext(‘文件’) 把文件的后缀名和前面分开,返回一个tuple 
    os.fork()



  • commands模块
  • commands模块只使用与linux的shell模式下

    [root@geenk03 opt]# cat test.py
    #!/usr/bin/env python
    import commands
    cmd = 'ls /home/'
    a = commands.getoutput(cmd)
    print (type(a))
    print (a)
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在上面我们在执行shell命令的时候,我们的shell命令可能执行报错,或者异常退出,我们就要有一个条件来判断shell最终执行的结果是什么,commands.getstatusoutput(cmd)的返回结果有两个值

    [root@geenk03 opt]# python test.py
    <type 'str'>
    aa.txt
    admin
    apache-maven-3.3.9-bin.tar.gz
    DATA
    easyexpress_controller.log
    easypush_error.log
    elk
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    [root@geenk03 opt]# cat test1.py
    #!/usr/bin/env python
    #coding:utf-8
    import commands
    
    cmd = 'ps -aux |grep nginx'
    # commands.getstatusoutput(cmd) 返回的是一个tuple
    t = commands.getstatusoutput(cmd)
    #result返回的是str,status 返回的是int
    #result就是命令的结果
    #如果键入的命令正确,则status为0,否则不为0
    status,result = commands.getstatusoutput(cmd)
    print (type(t))
    print (type(result))
    print(result)
    print(type(status))
    print (status)
    
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    [root@geenk03 opt]# python test1.py
    <type 'tuple'>
    <type 'str'>
    Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
    root     24724  0.0  0.0 106108  1136 pts/0    S+   15:20   0:00 sh -c { ps -aux |grep nginx; } 2>&1
    root     24726  0.0  0.0 103336   848 pts/0    S+   15:20   0:00 grep nginx
    <type 'int'>
    0
    
      
      







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值