Python标准库之Sys模块使用详解


Posted in Python onMay 23, 2015

sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分.

处理命令行参数

在解释器启动后, argv 列表包含了传递给脚本的所有参数, 列表的第一个元素为脚本自身的名称.

使用sys模块获得脚本的参数

print "script name is", sys.argv[0]        # 使用sys.argv[0]采集脚本名称
if len(sys.argv) > 1:

    print "there are", len(sys.argv)-1, "arguments:"  # 使用len(sys.argv)-1采集参数个数-1为减去[0]脚本名称

    for arg in sys.argv[1:]:            #输出除了[0]外所有参数

        print arg

else:

    print "there are no arguments!"

如果是从标准输入读入脚本 (比如 "python < sys-argv-example-1.py"), 脚本的名称将被设置为空串.

如果把脚本作为字符串传递给python (使用 -c 选项), 脚本名会被设置为 "-c".

处理模块

path 列表是一个由目录名构成的列表, Python 从中查找扩展模块( Python 源模块, 编译模块,或者二进制扩展).

启动 Python 时,这个列表从根据内建规则, PYTHONPATH 环境变量的内容, 以及注册表( Windows 系统)等进行初始化.

由于它只是一个普通的列表, 你可以在程序中对它进行操作,

使用sys模块操作模块搜索路径

print "path has", len(sys.path), "members"
sys.path.insert(0, "samples")  #将路径插入到path,[0]中

import sample
sys.path = []  #删除path中所有路径

import random

使用sys模块查找内建模块

builtin_module_names 列表包含 Python 解释器中所有内建模块的名称

def dump(module):

    print module, "=>",

    if module in sys.builtin_module_names:  #查找内建模块是否存在

        print "<BUILTIN>"

    else:

        module = _ _import_ _(module)         #非内建模块输出模块路径

        print module._ _file_ _
dump("os")

dump("sys")

dump("string")

dump("strop")

dump("zlib")
os => C:\python\lib\os.pyc

sys => <BUILTIN>

string => C:\python\lib\string.pyc

strop => <BUILTIN>

zlib => C:\python\zlib.pyd

使用sys模块查找已导入的模块

modules 字典包含所有加载的模块. import 语句在从磁盘导入内容之前会先检查这个字典.

Python 在处理你的脚本之前就已经导入了很多模块.

print sys.modules.keys()


['os.path', 'os', 'exceptions', '_ _main_ _', 'ntpath', 'strop', 'nt',

'sys', '_ _builtin_ _', 'site', 'signal', 'UserDict', 'string', 'stat']

使用sys模块获得当前平台

sys.platform  返回当前平台 出现如: "win32" "linux2" 等

处理标准输出/输入

标准输入和标准错误 (通常缩写为 stdout 和 stderr) 是内建在每一个 UNIX 系统中的管道。

当你 print 某些东西时,结果前往 stdout 管道;

当你的程序崩溃并打印出调试信息 (例如 Python 中的 traceback (错误跟踪)) 的时候,信息前往 stderr 管道

>>> for i in range(3):

...     print'Dive in'
Dive in

Dive in

Dive in

>>> import sys

>>> for i in range(3):

...     sys.stdout.write('Dive in')
Dive inDive inDive in

>>> for i in range(3):

...     sys.stderr.write('Dive in')
Dive inDive inDive in

stdout 是一个类文件对象;调用它的 write 函数可以打印出你给定的任何字符串。

实际上,这就是 print 函数真正做的事情;它在你打印的字符串后面加上一个硬回车,然后调用 sys.stdout.write 函数。

在最简单的例子中,stdout 和 stderr 把它们的输出发送到相同的地方

和 stdout 一样,stderr 并不为你添加硬回车;如果需要,要自己加上。

stdout 和 stderr 都是类文件对象,但是它们都是只写的。

它们都没有 read 方法,只有 write 方法。然而,它们仍然是类文件对象,因此你可以将其它任何 (类) 文件对象赋值给它们来重定向其输出。

使用sys重定向输出

print 'Dive in'        # 标准输出

saveout = sys.stdout        # 终在重定向前保存stdout,这样的话之后你还可以将其设回正常

fsock = open('out.log', 'w')      # 打开一个新文件用于写入。如果文件不存在,将会被创建。如果文件存在,将被覆盖。

sys.stdout = fsock                 # 所有后续的输出都会被重定向到刚才打开的新文件上。
print  'This message will be logged instead of displayed'    # 这样只会将输出结果“打印”到日志文件中;屏幕上不会看到输出
sys.stdout = saveout   # 在我们将 stdout 搞乱之前,让我们把它设回原来的方式。    
fsock.close()     # 关闭日志文件。

重定向错误信息

fsock = open('error.log', 'w')           # 打开你要存储调试信息的日志文件。
sys.stderr = fsock                           # 将新打开的日志文件的文件对象赋值给stderr以重定向标准错误。
raise Exception, 'this error will be logged'   # 引发一个异常,没有在屏幕上打印出任何东西,所有正常的跟踪信息已经写进error.log

还要注意你既没有显式关闭日志文件,也没有将 stderr 设回最初的值。

这样挺好,因为一旦程序崩溃 (由于引发的异常),Python 将替我们清理并关闭文件

打印到 stderr

向标准错误写入错误信息是很常见的,所以有一种较快的语法可以立刻导出信息

>>> print 'entering function'

entering function

>>> import sys

>>> print >> sys.stderr, 'entering function'
entering function

print 语句的快捷语法可以用于写入任何打开的文件 (或者是类文件对象)。

在这里,你可以将单个print语句重定向到stderr而且不用影响后面的print语句。

使用sys模块退出程序

import sys

sys.exit(1)

注意 sys.exit 并不是立即退出. 而是引发一个 SystemExit 异常. 这意味着你可以在主程序中捕获对 sys.exit 的调用

捕获sys.exit调用

import sys

print "hello"

try:

    sys.exit(1)

except SystemExit:   # 捕获退出的异常

    pass                    # 捕获后不做任何操作

print "there"


hello

there

如果准备在退出前自己清理一些东西(比如删除临时文件), 你可以配置一个 "退出处理函数"(exit handler), 它将在程序退出的时候自动被调用

另一种捕获sys.exit调用的方法

def exitfunc():

    print "world"
sys.exitfunc = exitfunc  # 设置捕获时调用的函数
print "hello"

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

print "there"  # 不会被 print
hello

world
Python 相关文章推荐
python获取指定目录下所有文件名列表的方法
May 20 Python
用pickle存储Python的原生对象方法
Apr 28 Python
Pycharm学习教程(3) 代码运行调试
May 03 Python
基于python中theano库的线性回归
Aug 31 Python
Python sorted函数详解(高级篇)
Sep 18 Python
python计算两个矩形框重合百分比的实例
Nov 07 Python
python basemap 画出经纬度并标定的实例
Jul 09 Python
Python中BeautifuSoup库的用法使用详解
Nov 15 Python
Python使用正则实现计算字符串算式
Dec 29 Python
如何通过命令行进入python
Jul 06 Python
python报错: 'list' object has no attribute 'shape'的解决
Jul 15 Python
OpenCV3.3+Python3.6实现图片高斯模糊
May 18 Python
Python OS模块常用函数说明
May 23 #Python
在Python中操作时间之tzset()方法的使用教程
May 22 #Python
详解Python中time()方法的使用的教程
May 22 #Python
在Python中操作时间之strptime()方法的使用
Dec 30 #Python
详解Python中的strftime()方法的使用
May 22 #Python
Python中用sleep()方法操作时间的教程
May 22 #Python
python使用reportlab实现图片转换成pdf的方法
May 22 #Python
You might like
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
jQuery事件绑定.on()简要概述及应用
2013/02/07 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
Javascript 正则表达式实现为数字添加千位分隔符
2015/03/10 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
一个有意思的鼠标点击文字特效jquery代码
2017/09/23 jQuery
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
2017/12/25 Javascript
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
解决betterScroll在vue中存在图片时,出现拉不动的问题
2018/09/27 Javascript
js中this的指向问题归纳总结
2018/11/28 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
2015/05/09 Python
Python使用回溯法子集树模板解决迷宫问题示例
2017/09/01 Python
Python3实现的字典遍历操作详解
2018/04/18 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
python 检查数据中是否有缺失值,删除缺失值的方式
2019/12/02 Python
python 爬取疫情数据的源码
2020/02/09 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
在django admin中配置搜索域是一个外键时的处理方法
2020/05/20 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
美国顶级品牌男士大码服装店:DXL
2017/08/30 全球购物
南非最大的在线时尚商店:Zando
2019/07/21 全球购物
酒店公关部经理岗位职责
2013/11/24 职场文书
幼儿园教师岗位职责
2014/03/17 职场文书
成品库仓管员岗位职责
2014/04/06 职场文书
幼师辞职信怎么写
2015/02/27 职场文书
村官个人总结范文
2015/03/03 职场文书
活动宣传稿范文
2015/07/23 职场文书
Redis入门基础常用操作命令整理
2022/06/01 Redis