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

   这篇文章主要介绍了Python标准库之Sys模块使用详解,本文讲解了使用sys模块获得脚本的参数、处理模块、使用sys模块操作模块搜索路径、使用sys模块查找内建模块、使用sys模块查找已导入的模块等使用案例,需要的朋友可以参考下

  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 ""

  else:

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

  print module._ _file_ _

  dump("os")

  dump("sys")

  dump("string")

  dump("strop")

  dump("zlib")

  os => C:pythonlibos.pyc

  sys =>

  string => C:pythonlibstring.pyc

  strop =>

  zlib => C:pythonzlib.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

时间: 2024-11-08 19:21:14

Python标准库之Sys模块使用详解的相关文章

使用Python标准库中的wave模块绘制乐谱的简单教程_python

在本文中,我们将探讨一种简洁的方式,以此来可视化你的MP3音乐收藏.此方法最终的结果将是一个映射你所有歌曲的正六边形网格地图,其中相似的音轨将处于相邻的位置.不同区域的颜色对应不同的音乐流派(例如:古典.嘻哈.重摇滚).举个例子来说,下面是我所收藏音乐中三张专辑的映射图:Paganini的<Violin Caprices>.Eminem的<The Eminem Show>和Coldplay的<X&Y>. 为了让它更加有趣(在某些情况下更简单),我强加了一些限制.

Python标准库defaultdict模块使用示例

  Python标准库中collections对集合类型的数据结构进行了很多拓展操作,这些操作在我们使用集合的时候会带来很多的便利,多看看很有好处. defaultdict是其中一个方法,就是给字典value元素添加默认类型,之前看到过但是没注意怎么使用,今天特地瞅了瞅. 首先是各大文章介绍的第一个例子: 代码如下: import collections as coll def default_factory(): return 'default value' d = coll.defaultd

Python中的zipfile模块使用详解

  这篇文章主要介绍了Python中的zipfile模块使用详解,zipfile模块是用来操作zip文件,需要的朋友可以参考下 zip文件格式是通用的文档压缩标准,在ziplib模块中,使用ZipFile类来操作zip文件,下面具体介绍一下: class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]]) 创建一个ZipFile对象,表示一个zip文件.参数file表示文件的路径或类文件对象(file-like object);参

Python标准库——走马观花

原文:Python标准库--走马观花 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   Python的一大好处在于它有一套很有用的标准库(standard library).标准库是随着Python一起安装在你的电脑中的,是Python的一部分 (当然也有特殊情况.有些场合会因为系统安全性的要求,不使用全部的标准库,比如说Google App Engine).   利用已有的类(class)和函数(function)进行开发

Python 标准库 urllib2 的使用细节

文章转载自:http://zhuoqiang.me/python-urllib2-usage.html Python 标准库中有很多实用的工具类,但是在具体使用时,标准库文档上对使用细节描述的并不清楚,比如 urllib2 这个 HTTP 客户端库.这里总结了一些 urllib2 的使用细节. Proxy 的设置 Timeout 设置 在 HTTP Request 中加入特定的 Header Redirect Cookie 使用 HTTP 的 PUT 和 DELETE 方法 得到 HTTP 的返

Python标准库的学习准备

原文:Python标准库的学习准备 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   Python标准库是Python强大的动力所在,我们已经在前文中有所介绍.由于标准库所涉及的应用很广,所以需要学习一定的背景知识.   硬件原理 这一部份需要了解内存,CPU,磁盘存储以及IO的功能和性能,了解计算机工作的流程,了解指令的概念.这些内容基础而重要. Python标准库的一部份是为了提高系统的性能(比如mmap),所以有必要了

Python标准库urllib2的一些使用细节总结_python

Python 标准库中有很多实用的工具类,但是在具体使用时,标准库文档上对使用细节描述的并不清楚,比如 urllib2 这个 HTTP 客户端库.这里总结了一些 urllib2 的使用细节. 1.Proxy 的设置 2.Timeout 设置 3.在 HTTP Request 中加入特定的 Header 4.Redirect 5.Cookie 6.使用 HTTP 的 PUT 和 DELETE 方法 7.得到 HTTP 的返回码 8.Debug Log Proxy 的设置 urllib2 默认会使用

Python标准库11 多进程探索 (multiprocessing包)

原文:Python标准库11 多进程探索 (multiprocessing包) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   在初步了解Python多进程之后,我们可以继续探索multiprocessing包中更加高级的工具.这些工具可以让我们更加便利地实现多进程.   进程池 进程池 (Process Pool)可以创建多个进程.这些进程就像是随时待命的士兵,准备执行任务(程序).一个进程池中可以容纳多个待命的士兵.

Python标准库10 多进程初步 (multiprocessing包)

原文:Python标准库10 多进程初步 (multiprocessing包) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   我们已经见过了使用subprocess包来创建子进程,但这个包有两个很大的局限性:1) 我们总是让subprocess运行外部的程序,而不是运行一个Python脚本内部编写的函数.2) 进程间只通过管道进行文本交流.以上限制了我们将subprocess包应用到更广泛的多进程任务.(这样的比较实际是