day17——logging、os模块、commands模块、sys模块

logging的使用

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

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

import logging

logging.debug("This is debug message")

logging.info("The is info message")

logging.warning("This is warning message")

logging.error("This is error message")

logging.critical("This is critical message") #这种日志模式很少用一般到error

打印结果为:

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

默认情况下,logging将日志打印到屏幕,日志级别大小关系为:critical > error > warning > info > debug > notset,当然也可以自己定义日志级别

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

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

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

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

●CRITICAL:一个严重的错误,一般基本上所有的程序都是这个级别,有助于我们排查问题,但是当发生问题,我们没法定位到问题,很多情况下我们需要把日志级别揭开到debug级别,那又怎么办呢?

从上往下,日志级别逐渐升高,debug -----> info -----> warning -----> error ----->critical

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

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

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

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‘)

结果:

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

2017/04/26 13:57:11 test.py[line:10] DEBUG This is debug message

2017/04/26 13:57:11 test.py[line:11] INFO This is info message

2017/04/26 13:57:11 test.py[line:12] WARNING This is warning message解释:

主要是通过logging.basicConfig函数进行操作,现在我们来介绍一下该函数参数的用法:

level:设置日志级别,默认为logging.WARNING

filename:指定日志文件名

filemode:和file函数意义相同,指定日志文件的打开模式,‘w‘或‘a‘

format:指定输出的格式和内容,format可以输出很多有用信息,如上例所示:

%(levelnae)s:打印日志级别名称

%(filename)s:打印当前执行程序名

%(funName)s:打印日志的当前函数

%(lineno)d:打印日志的当前行号

%(asctime)s:打印日志的时间

%(thread)d:打印线程ID

%(message)s:打印日志信息

datefmt:指定时间格式,同time.strftime()

stream:指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stder,当stream和filename同时指定时,stream被忽略。

logging.getLogger([name]):创建一个日志对象

返回一个logger实例,如果没有指定name,返回root logger。只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是一 一对应的,返回的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()来获得最后系统命令最终的结果

3.目录和文件相关操作

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

import os

print(os.getcwd())

##获得路径

os.chdir(‘d:‘)

print(os.getcwd())

os.chdir(r‘E:\test‘)

##当前目录切换到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系统的分隔符\n,windows系统的分隔符\r\n,mac系统的分隔符\r

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

# E:\test\abc.txt

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

# False

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

#只是拼接,并不出创建 # E:\test\abc.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:\test\aaa‘):

os.mkdir(r‘E:\test\aaa‘)

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

print(os.path.dirname(r‘E:\test\test.py‘))

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

解释:

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模块

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

a)commands.getoutput(cmd)

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

举个例子:

[[email protected] ~]# 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)

结果:

[[email protected] ~]# 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)的返回结果有两个值,

[[email protected] ~]# 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))

结果:

[[email protected] ~]# 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语言的额巧妙之处。

f)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.stdin\stdout\stderr

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

2..1 sys.stdout 与 print

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

以下两行在事实上等价:

import sys

sys.stdout.write(‘hello‘+‘\n‘)

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 ‘\n‘ in input stream

print(b)

2.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)后面的内容就不会执行了,因为程序已经退出。

时间: 2024-10-09 00:50:13

day17——logging、os模块、commands模块、sys模块的相关文章

Python之旅的第15天(os、json、sys模块,模块引入补充)

今天内容不多,所以都进行了测试 一.bin.py文件也存在与子目录之下,如何通过bin.py文件转入main.py 文件存储的大致位置: main.py文件存放内容 from ceshi1 import add def run(): print('main def start') print(add.ad(2,3)) return 'main def start' add.py文件存放内容 def add(x,y): return x+y bin.py文件内容和总结 # 关于昨天讲到的bin.p

【Python模块学习】sys模块

sys模块的操作如下: 1 sys.argv # 实现从程序外部向程序传递参数. 2 sys.exit([arg]) # 程序中间的退出,arg=0为正常退出. 3 sys.getdefaultencoding() # 获取系统当前编码,一般默认为ascii. 4 sys.setdefaultencoding() # 设置系统默认编码,执行dir(sys)时不会看到这个方法,在解释器中执行不通过,可以先执行reload(sys),在执行 setdefaultencoding('utf8'),此时

Python的logging模块、os模块、commands模块与sys模块

一.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 默认情况下,logging将日志打印到屏幕,日志级别为WARNING: 日志级别大小关系为:CRITICAL > ERR

Python基础第十三天——sys模块、logging模块、json模块、pickle模块

一.sys模块 1.定义: 与python解释器交互的一个模块 2.sys模块常用的方法 (1)sys.argv方法 定义:命令行参数list,第一个元素是程序本身路径 例: import sys print(sys.argv) # sys.argv只是反映当前模块名,用一个列表存着 # 而pycharm软件则给我们自动加上了绝对路径 输出结果:          # 这个结果并不正确,是因为这是pycharm给加上去的 ['C:/Users/William/PycharmProjects/Py

第三十五篇 os模块、sys模块、json模块、pickle模块

目录 一.os模块 二.sys模块 三.json模块 dump和load 四.pickle模块 一.os模块 os模块和操作系统交互,主要用于文件操作 import os # test.py文件中 # os.mkdir() 一个路径参数和一个字符串参数.如果有路径参数,则在该路径下创建一个新的文件夹:如果无路径参数,则在当前文件的同级路径下创建一个新的文件夹 os.mkdir('king') # 创建了和test.py文件同级目录下的名为king的文件夹 # os.removedirs() 一个

python之sys模块详解

sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和我一起走进python的模块吧! sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传递参数. sys.exit([arg]): 程序中间的退出,arg=0为正常退出. sys.stdout.write('please:'):标准输出,引出进度条的例子 sys.getrecursionlimit() :获取最大递归层数 sys.setrecursionlimit(1200):设置最大递归层数 sys.getdef

python 标准库模块之 sys 模块

sys 模块的作用 sys 模块用于解释器相关的操作,通常用于脚本传参 sys 模块的常见用法 sys.argv 传递到Python脚本的命令行参数列表,第一个元素是程序本身路径sys.executable 返回python 解释器在当前系统中的绝对路径sys.exit([arg]) 程序中间的退出,arg=0为正常退出sys.platform 返回操作系统平台名称,Linux是linux2,Windows是win32sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量

python sys 模块常用方法小结

旨在记录 python sys 模块的常用方法 sys 模块常用方法及属性 sys.argv: 接收外部传递的参数. sys.exit([arg]): 程序退出,arg 为 0 正常退出. sys.getdefaultencoding(): 获取系统当前编码,一般默认为ascii. sys.setdefaultencoding(): 设置系统默认编码,执行dir(sys)时不会看到这个方法,在解释器中执行不通过,可以先执行reload(sys),在执行 setdefaultencoding('u

python 常用模块 time random os模块 sys模块 json &amp; pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess logging re正则 转自老男孩老师Yuan:http://www.cnblogs.com/yuanchenqi/articles/5732581.html 模块&包(* * * * *) 模块(modue)的概念: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,