zoukankan      html  css  js  c++  java
  • 20171110_Python学习四周五次课

    今日任务:

    四周五次课(11月10日)
    10.4 logging
    10.5 os模块
    10.6 command模块
    10.7 sys模块

     logging的使用

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

    首先,我们先来看一个例子:

    import logging

    logging.debug('This is debug message')

    logging.info('This is info message')

    logging.warning('This is warning message')

    结果:

    WARNING:root:This is warning message

    解释:我们写了三句话,但是在屏幕上只打印了一个warning级别的日志,这个是怎么回事呢?

    默认情况下,logging将日志打印到屏幕,日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别。

      ● DEBUG:详细的信息,通常只出现在诊断问题上。

      ● INFO:确认一切按预期运行

      ● WARNING:一个警告,可能会有一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”)。这个软件还能按预期工作

      ● ERROR:个更严重的问题,软件没能执行一些功能

      ● CRITICAL:一个严重的错误,这表明程序本身可能无法继续运行

    而默认logging默认的日志级别是info,一般基本上所有的程序都是这个级别,有助于我们排查问题,但是当发生问题,我们没法定位到问题,很多情况下我们需要把日志级别提升到debug级别,那又怎么办呢?

    二:通过logging.basicConfig函数对日志的输出格式及方式做相关配置

    现实工作中,往往我们是要把日志写在日志文件中的,那怎么做呢?看如下代码:

    结果:

    在当前文件新增了一个myapp.log文件,文件的内容如下:

    2017/11/10 15:13:42 6.py[line:6] DEBUG This is debug message
    2017/11/10 15:13:42 6.py[line:7] INFO This is info message
    2017/11/10 15:13:42 6.py[line:8] 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__。

    os模块的使用

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

    1,通过os获取系统类型

    import os

    print(os.name)

    这个就是查看我们系统的类型,如果是windows系统,os.name = 'nt',如果是linux系统os.name = 'posix',不同的操作系统是命令可能不一样。所以在使用系统命令之前,我们先要判断系统是linux系统还是windows系统。

    2,执行系统命令

    很多情况,我们通过python来代用系统命令,

    import os

    os.system(‘ipconfig’)

    content=os.popen('ipconfig').read()

    print(content)

    解释:

    该代码调用了windows系统的ipconfig命令,ipconfig是用来查看windows系统ip的。os.system(‘ifconfig’)只会调用系统的命令,但是当我们需要获得系统命令最后的执行结果的时候该怎么办呢?

    这时候我们就用os.popen方法,os.popen()返回的是一个file对象,我们可以通过file.read()来获得最后系统命令最终的结果

    1, 目录和文件相关操作

    下面我们通过例子来看一下

    import os

    print(os.getcwd())

    ##获得路径

    os.chdir('d:')

    print(os.getcwd())

    os.chdir(r'E: est')

    ##当前目录切换到d:目录下,在切换回来

    print(os.listdir(os.getcwd()))

    #列出当前目录的文件

    print(os.listdir('C:Python27'))

    #列出C:Python27目录下的文件

    os.mkdir('abc')

    #在当前目录下创建abc目录

    os.remove('1.txt')

    # 删除当前目录下的1.txt文件,(如果文件不存在会报错)

    print(os.linesep)

    #打印操作系统的分隔符,linux系统的分隔符 ,windows系统的分隔符 ,mac系统的分隔符

    print(os.path.join(os.getcwd(), 'abc.txt'))

    # E: estabc.txt

    print(os.path.islink(os.getcwd()))

    # False

    print(os.path.join(os.getcwd(), 'abc.txt'))

    #只是拼接,并不出创建 # E: estabc.txt

    path1 = os.path.join(os.getcwd(), 'abc.txt')

    print(os.path.split(path1))

    #把最后文件和目录分开# ('E:\test', 'abc.txt')

    Print(os.path.splitdrive(path1))     #把最初的目录和后面分开

    # ('E:', '\test\abc.txt')

    Print(os.path.splitext(path1))       #把目录和后缀名分开

    # ('E:\test\abc', '.txt')

    if not os.path.exists(r'E: estaaa'):

        os.mkdir(r'E: estaaa')

    ##当前目录下存在aaa目录,不创建,当前不存在aaa目录,创建aaa目录

    print(os.path.dirname(r'E: est est.py'))

    #获得E: est est.py文件的目录

    解释:

    1,os.getcwd()   获得目录的当前系统程序工作路劲

    2,os. chdir(‘目标目录’)  切换到目标目录

    3,os.listdir(‘字符串目录’)     列出字符串目录下的所有文件

    4,os.mkdir('目录')   创建目录

    5,os.remove('1.txt')       删除文件,文件不存在时会报错

    6,os.linesep      打印操作系统的分隔符,linux系统的分隔符 ,windows系统的分隔符 ,mac系统的分隔符

    7,os.path.join(os.getcwd(), 'aaa', ‘bbb’, ‘ccc’)   拼接出来多级目录:E: estaaabbccc

    8,os.path.exists(‘目录’)  判断目录是否存在

    9,os.path.split(‘文件或者目录’)  把最后的一个目录或者文件和前面的目录分开,返回一个tuple

    10,os.path.splitext(‘文件’)    把文件的后缀名和前面分开,返回一个tuple

    os.fork()

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

    在我们平时码字时,经常需要调用系统脚本或者系统命令来解决很多问题,接下来我们就介绍给大家一个很好用的模块command,可以通过python调用系统命令,调用系统命令command模块提供了三种方法:cmd代表系统命令

    a)     commands.getoutput(cmd)

    只返回执行shell命令的结果:

    举个例子:

    [root@localhost ~]# cat a.py

    #!/usr/bin/env python

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

    import commands

    cmd = 'ls /home/admin'

    a = commands.getoutput(cmd)

    print(type(a))

    print(a)

    结果:

    [root@localhost ~]# python a.py

    <type 'str'>

    nginx.conf

    nginx_upstream_check_module-master.zip

    test.py

    commands是提供linux系统环境下支持使用shell命令的一个模块,在企业中,我们很多的脚本和环境都是在linux系统中跑起来的,

    b)     commands.getstatusoutput(cmd)

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

    [root@localhost ~]# cat c.py

    #!/usr/bin/env python

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

    import commands

    cmd = 'ls /home/admin'

    c = commands.getstatusoutput(cmd)

    print(type(c))

    status, output = commands.getstatusoutput(cmd)

    print(status)

    print(output)

    print(type(output))

    结果:

    [root@localhost ~]# python c.py

    <type 'tuple'>

    0

    nginx.conf

    nginx_upstream_check_module-master.zip

    test.py

    <type 'str'>

    解释:

    Commands.getstatusoutput(cmd)的返回结果是一个tuple,第一个值是shell执行的结果,如果shell执行成功,返回0,否则,为非0,第二个是一个字符串,就是我们shell命令的执行结果,python通过一一对应的方式复制给status和output,这个就是python语言的额巧妙之处。

     

    sys模块

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

    1,通过sys模块获取程序参数

    import sys

    print('argv[0] = {0}     argv [1] = {1}'.format(sys.argv[0], sys.argv[1]))

    执行:python test.py hello

    结果:

    argv[0] = E:/test/test.py     argv [1] = hello

    解释:

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

    2,sys.stdinstdoutstderr

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

    2..1 sys.stdout 与 print

    当我们在 Python 中打印对象调用 print obj 时候,事实上是调用了sys.stdout.write(obj+' '),print 将你需要的内容打印到了控制台,然后追加了一个换行符,print 会调用 sys.stdout 的 write 方法

    以下两行在事实上等价:

    import sys

    sys.stdout.write('hello'+' ')

    print 'hello'

    2.2 sys.stdin 与 raw_input

    import sys

    a = raw_input('raw_input_name: ')

    print(a)

    print 'stdin_name: ', #comma to stay in the same line

    b = sys.stdin.readline()[:-1] # -1 to discard the ' ' in input stream

    print(b)

    1.3    从控制台重定向到文件

    Import sys

    f_handler=open('out.log', 'w')

    sys.stdout=f_handler

    print 'hello'

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

    3,捕获sys.exit(n)调用

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

    def exitfunc():

        print "hello world"

    sys.exitfunc = exitfunc  # 设置捕获时调用的函数

    print "aaaaaaaa"

    sys.exit(1)     # 退出自动调用exitfunc()后,程序依然退出了

    print "there"  # 不会被 print

    结果:

    aaaaaaaa

    hello world

    解释:

    1,设置sys.exitfunc函数,及当执行sys.exit(1)的时候,调用exitfunc函数

    2,sys.exit(1)后面的内容就不会执行了,因为程序已经退出。

  • 相关阅读:
    使用Microsoft.DirectX和Microsoft.DirectX.Sound进行录音时遇到的异常
    一个奇怪的TextChanged事件
    正则表达式
    lambda详解
    AOP统一处理请求
    SpringBoot表单参数验证
    208道Java常见面试题
    Java100道基础面试题
    Java多线程面试题
    Java编码规范
  • 原文地址:https://www.cnblogs.com/zhuntidaoren/p/7814823.html
Copyright © 2011-2022 走看看