- longgin
-
日志是我们排查问题的关键利器,写好日志记录,当我们发生问题时,可以快速定位代码范围进行修改。Python有给我们开发者们提供好的日志模块logging
#从上往下日志级别一级级升高 debug ->info->warning->error->critica
- 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级别,那又怎么办呢?- 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模块其实有很多功能的,那我们就介绍一些最常用的一些功能吧,这样对于大家来说更加容易上手:
- 1
- 2
- 3
在cmd下
D:\pyProject\class>python sys_Deno.py -i 1.txtargv[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
- 1
- 2
- 3
- 4
- 5
从控制台重定向到文件
- 1
- 2
- 3
- 4
在当前文件下新生成一个文件1.log,文件内容为hello,
捕获sys.exit(n)调用
功能:执行到主程序末尾,解释器自动退出,但是如果需要中途退出程序,可以调用sys.exit函数,带有一个可选的整数参数返回给调用它的程序,表示你可以在主程序中捕获对sys.exit的调用。(0是正常退出,其他为异常)
- 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获取系统类型
- 1
- 2
如果是windows系统,os.name = ‘nt’
如果是linux系统os.name = ‘posix’不同的操作系统是命令可能不一样。所以在使用系统命令之前,我们先要判断系统是linux系统还是windows系统
- 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模式下
- 1
- 2
- 3
- 4
- 5
- 6
- 7
在上面我们在执行shell命令的时候,我们的shell命令可能执行报错,或者异常退出,我们就要有一个条件来判断shell最终执行的结果是什么,commands.getstatusoutput(cmd)的返回结果有两个值
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18