python基础课程_学习笔记13:标准库:有些收藏夹——sys

标准库:有些收藏夹

sys

sys这个模块可以让你访问和python解释器联系紧密的变量和函数。

sys模块中一些重要的函数和变量

函数/变量 描写叙述

argv 命令行參数,包含脚本名称

exit([arg]) 退出当前程序,可选參数为给定的返回值或者错误信息

modules 映射模块名字到加载模块的字典

path 查找模块所在文件夹的文件夹名列表

platform 类似sunos5或者win32的平台标识符

stdin 标准输入流——一个类文件对象

stdout 标准输出流——一个类文件对象

stderr 标准错误流——一个类文件对象

变量sys.argv包含传递到python解释器的參数,包含脚本名称;

函数sys.exit能够退出当前程序(假设在try/finally块中调用。finally子句的内容仍然会被执行)。

能够提供一个整数參数。用来标识程序是否成功执行——unix的一个惯例。大多数情况下使用该整数的默认值就能够了(也就是0。表示成功)。

或者也能够提供字符串參数,用作错误信息,这对于用户找出程序停止执行的原因会非常实用。

这样,程序就会在退出的时候提供错误信息和标识程序执行失败的代码。

映射sys.modules将模块名映射到实际存在的模块上,它仅仅应用于眼下导入的模块。

sys.path是一个字符串列表,当中的每一个字符串都是一个文件夹名,在import语句运行时。解释器就会从这些文件夹中查找模块。

sys.platform模块变量是解释器正在其上执行的“平台”名称。

可能是操作系统的名字。也可能是标识其它种类的平台,假设你执行Jython的话,就是java虚拟机。

sys.stdin、sys.stdout、sys.stderr模块变量是类文件流对象。它们表示标准UNIX概念中的标准输入、标准输出和标准错误。

练习 处理命令行參数

当通过命令行调用python脚本时,可能会在后面加上一些參数——它们就是命令行參数。这些參数会放置在sys.argv列表中,脚本的名字为sys.argv[0]。

$ cat reverseargs.py

#!/usr/bin/python

import sys

args=sys.argv[1:]

args.reverse()

print ‘ ‘.join(args)

$ ./reverseargs.py 1 3 4

4 3 1

$ ./reverseargs.py 1 3 "ab" [2,4,‘6‘]

6 4 2 ab 3 1

获取脚本參数

脚本内容

$ cat sys-argv-example-1.py

# File:sys-argv-example-1.py

import sys

print "Script name is",sys.argv[0]

if len(sys.argv) > 1:

print "there is",len(sys.argv)-1,"arguments:"

print [x for x in sys.argv[1:]]

else:

print "there are no arguments!"

运行结果

$ python sys-argv-example-1.py

Script name is sys-argv-example-1.py

there are no arguments!

$ python sys-argv-example-1.py ‘a‘ 2 ‘c‘ ‘four‘

Script name is sys-argv-example-1.py

there is 4 arguments:

[‘a‘, ‘2‘, ‘c‘, ‘four‘]

假设从标准输入读取脚本(如”python < sys-argv-example-1.py”),脚本名称将被设置为空字符串。

假设把脚本作为字符串传递给python(使用-c參数)。则脚本名称被设置为“-c”。

$ python < sys-argv-example-1.py

Script name is

there are no arguments!

练习 处理模块

操作模块的路径

脚本内容

$ cat sys-path-example-1.py

#File:sys-path-example-1.py

import sys

print "path has",len(sys.path),"members"

print sys.path

#add the sample directory to the path

sys.path.insert(0,"samples")

print "path has",len(sys.path),"members"

print sys.path

import sample

#nuke the path

sys.path=[]

import random # oops!

运行结果

path has 10 members

[‘/home/ggz2/magiccube/mysh/pys‘, ‘/usr/lib64/python26.zip‘, ‘/usr/lib64/python2.6‘, ‘/usr/lib64/python2.6/plat-linux2‘, ‘/usr/lib64/python2.6/lib-tk‘, ‘/usr/lib64/python2.6/lib-old‘, ‘/usr/lib64/python2.6/lib-dynload‘, ‘/usr/lib64/python2.6/site-packages‘, ‘/usr/lib64/python2.6/site-packages/gtk-2.0‘, ‘/usr/lib/python2.6/site-packages‘]

path has 11 members

[‘samples‘, ‘/home/ggz2/magiccube/mysh/pys‘, ‘/usr/lib64/python26.zip‘, ‘/usr/lib64/python2.6‘, ‘/usr/lib64/python2.6/plat-linux2‘, ‘/usr/lib64/python2.6/lib-tk‘, ‘/usr/lib64/python2.6/lib-old‘, ‘/usr/lib64/python2.6/lib-dynload‘, ‘/usr/lib64/python2.6/site-packages‘, ‘/usr/lib64/python2.6/site-packages/gtk-2.0‘, ‘/usr/lib/python2.6/site-packages‘]

Traceback (most recent call last):

File "sys-path-example-1.py", line 12, in <module>

import sample

ImportError: No module named sample

查找内建模块

脚本内容

$ cat sys-builtin-module-names-example-1.py

# File :sys-builtin-module-names-example-1.py

import sys

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

运行结果

$ python sys-builtin-module-names-example-1.py

os => /usr/lib64/python2.6/os.pyc

sys => <BUILTIN>

string => /usr/lib64/python2.6/string.pyc

strop => /usr/lib64/python2.6/lib-dynload/stropmodule.so

zlib => /usr/lib64/python2.6/lib-dynload/zlibmodule.so

查找导入的模块

脚本内容

$ cat sys-modules-example-1.py

#File:sys-modules-example-1.py

import sys

print sys.modules.keys()

运行结果

$ python sys-modules-example-1.py

[‘copy_reg‘, ‘encodings‘, ‘site‘, ‘__builtin__‘, ‘__main__‘, ‘encodings.encodings‘, ‘abc‘, ‘posixpath‘, ‘errno‘, ‘encodings.codecs‘, ‘_abcoll‘, ‘types‘, ‘_codecs‘, ‘_warnings‘, ‘genericpath‘, ‘stat‘, ‘zipimport‘, ‘encodings.__builtin__‘, ‘warnings‘, ‘UserDict‘, ‘encodings.utf_8‘, ‘sys‘, ‘codecs‘, ‘os.path‘, ‘signal‘, ‘linecache‘, ‘posix‘, ‘encodings.aliases‘, ‘exceptions‘, ‘os‘]

练习 引用计数

获得引用数量

getrefcount函数返回给定对象的引用数量。即变量被引用的数量。python追踪这些变量,当引用数为0时,对象被销毁。

脚本内容

$ cat sys-getrefcount-example-1.py

#File:sys-getrefcount-example-1.py

import sys

variable=1234

print sys.getrefcount(0)

print sys.getrefcount(variable)

print sys.getrefcount(None)

运行结果

$ python sys-getrefcount-example-1.py

147

4

700

注意:这个值总是比实际的值要大些,由于当确定值时函数本身依赖这个对象。

练习 主机平台

脚本内容

$ cat sys-platform-example-1.py

#File:sys-platform-example-1.py

import sys

#

# emulate "import os.path" (sort of)...

if sys.platform == "win32":

import ntpath

pathmodule=ntpath

elif sys.platform == "mac":

import macpath

pathmodule=macpath

else:

# assume it‘s a posix platform

import posixpath

pathmodule=posixpath

print pathmodule

运行结果

centos 5.4系统下运行:

$ python sys-platform-example-1.py

<module ‘posixpath‘ from ‘/usr/lib64/python2.6/posixpath.pyc‘>

Win7系统下运行:

<module ‘ntpath‘ from ‘D:\software(x86)\Python27\lib\ntpath.pyc‘>

典型的平台名称为win32(Windows 9x/NT平台)和mac(Macintosh平台)。Unix操作系统,平台名称通常由命令“uname -r”命令导出。比方irix6。linux2,或者sunos5(Solaris)。

$ uname -r

2.6.32-358.el6.x86_64

练习 追踪程序

setprofiler函数同意你配置一个配置函数。每当一个函数或方法被调用,每一次返回(隐式或显式),每一次异常时被调用。

脚本内容

$ cat sys-setprofiler-example-1.py

#File:sys-setprofiler-example-1.py

import sys

def test(n):

j=0

for i in range(n):

j=j+i

return n

def profiler(frame,event,arg):

print event,frame.f_code.co_name,frame.f_lineno,"->",arg

# profiler is activated on the next call,return,or exception

sys.setprofile(profiler)

# profile this function call

test(1)

# disable profiler

sys.setprofile(None)

# don‘t profile this call

test(2)

运行结果

$ python sys-setprofiler-example-1.py

call test 5 -> None

c_call test 7 -> <built-in function range>

c_return test 7 -> <built-in function range>

return test 9 -> 1

c_call <module> 21 -> <built-in function setprofile>

基于该函数,profile模块提供了完整的分析器框架。

settrace函数与此类似,但trace函数在解释器运行新行的时候被调用。

脚本内容

$ cat sys-settrace-example-1.py

#File:sys-settrace-example-1.py

import sys

def test(n):

j=0

for i in range(n):

j=j+1

return n

def tracer(frame,event,arg):

print event,frame.f_code.co_name,frame.f_lineno,"->",arg

return tracer

#trace is activated on the next call,return,or exception

sys.settrace(tracer)

#trace this function call

test(1)

# disable tracing

sys.settrace(None)

# don‘t trace this call

test(2)

运行结果

$ python sys-settrace-example-1.py

call test 5 -> None

line test 6 -> None

line test 7 -> None

line test 8 -> None

line test 7 -> None

line test 9 -> None

return test 9 -> 1

基于该函数提供的跟踪功能,pdb模块提供了一个完整的调试器框架。

练习 操作标准输入输出

stdin、stdout、stderr变量包括与标准输入输出流相相应的流对象。假设须要提供比print更好地控制输出能够直接訪问它们。

假设你想重定向输入和输出到其他设备也能够替换它们。或者以某种非标准方式处理它们。

重定向输出

脚本内容

$ cat sys-stdout-example-1.py

#File:sys-stdout-example-1.py

import sys

import string

class Redirect:

def __init__(self,stdout):

self.stdout=stdout

def write(self,s):

self.stdout.write(string.lower(s))

# redirect standard output(including the print statement)

old_stdout=sys.stdout

sys.stdout=Redirect(sys.stdout)

print "HEJA SVERIGE",

print "FRISKT HUM\303\226R"

# restore standard output

sys.stdout=old_stdout

print "M\303\205\303\205\303\205\303\205L!"

运行结果

$ python sys-stdout-example-1.py

heja sverige friskt hum?r

M????L!

练习 退出程序

当到达主程序的末尾时,解释器自己主动终止。假设须要中途退出,能够调用sys.exit函数。它能给调用它的程序返回一个可配置的整数。

退出程序

脚本内容

$ cat sys-exit-example-1.py

#File :sys-exit-example-1.py

import sys

print "Hello"

sys.exit(1)

print "there"

运行结果

$ python sys-exit-example-1.py

Hello

注意:sys.exit不是马上退出的,相反地。它引发了一个SystemExit异常。

捕获调用sys.exit

脚本内容

$ cat sys-exit-example-2.py

#File :sys-exit-example-2.py

import sys

print "Hello"

try:

sys.exit(1)

except SystemExit:

pass

print "there"

运行结果

$ python sys-exit-example-2.py

Hello

there

假设你想在你之后清空一些内容。能够设置exit handle,它是一个在退出时自己主动调用的函数。

用还有一种方式捕获调用sys.exit

脚本内容

$ cat sys-exitfunc-example-1.py

#File:sys-exitfunc-example-1.py

import sys

def exitfunc():

print "world"

sys.exitfunc=exitfunc

print "hello"

sys.exit(1)

print "there" # never printed

运行结果

$ python sys-exitfunc-example-1.py

hello

world

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-12-25 16:32:26

python基础课程_学习笔记13:标准库:有些收藏夹——sys的相关文章

python基础教程_学习笔记13:标准库:一些最爱——sys

标准库:一些最爱 sys sys这个模块让你能够访问与python解释器联系紧密的变量和函数. sys模块中一些重要的函数和变量 函数/变量 描述 argv 命令行参数,包括脚本名称 exit([arg]) 退出当前程序,可选参数为给定的返回值或者错误信息 modules 映射模块名字到载入模块的字典 path 查找模块所在目录的目录名列表 platform 类似sunos5或者win32的平台标识符 stdin 标准输入流--一个类文件对象 stdout 标准输出流--一个类文件对象 stde

python基础课程_学习笔记20:标准库:有些收藏夹——os

标准库:有些收藏夹 os os模块为您提供访问多个操作系统服务特征. os和它的子模块os.path还包含一些用于检查.构造.删除文件夹和文件的函数,以及一些处理路径的函数. os模块中一些重要函数和变量 函数/变量 描写叙述 environ 对环境变量进行映射 system(command) 在子shell中运行操作系统命令 sep 路径中的分隔符 pathsep 分隔路径的分隔符 linesep 行分隔符('\n','\r','\r\n') urandom(n) 返回n字节的加密强随机数据

python基础教程_学习笔记15:标准库:一些最爱——fileinput

标准库:一些最爱 fileinput 重要的函数 函数 描述 input([files[,inplace[,backup]]) 便于遍历多个输入流中的行 filename() 返回当前文件的名称 lineno() 返回当前(累计)的名称 filelineno() 返回当前文件的行数 isfirstline() 检查当前行是否是文件的第一行 isstdin() 检查最后一行是否来自sys.stdin nextfile() 关闭当前文件,移动到下一个文件 close() 关闭序列 fileinput

python基础教程_学习笔记16:标准库:一些最爱——random

标准库:一些最爱 random random模块包括返回随机数的函数,可以用于模拟或者用于任何产生随机输出的程序. 事实上,所产生的数字都是伪随机数,它们以一个可预测的系统作为基础,除非是为了强加密的目标,否则这些随机数还是足够随机的.如果真的需要随机性,可以使用os模块的urandom函数. 重要函数 函数 描述 random() 返回0<=n<1之间的随机实数n,其中0<n<=1 getrandbits(n) 以长整型形式返回n个随机位(二进制数) uniform(a,b) 返

python基础教程_学习笔记17:标准库:一些最爱——time

标准库:一些最爱 time time模块所包含的函数能够实现以下功能: 获取当前时间.操作系统时间和日期.从字符串读取时间以及格式化时间为字符串. 日期可以用实数(从"新纪元"的1月1日0点开始计算到现在的秒数,新纪元是一个与平台相关的年份,对unix来说是1970年),或者是包含有9个整数的元组. 日期元组的字段含义 如元组: (2008,1,21,12,2,56,0,21,0) 表示2008年1月21日12时2分56秒,星期一,且是当年的第21天(无夏令时). 索引 字段 值 0

python基础教程_学习笔记14:标准库:一些最爱——re

标准库:一些最爱 re re模块包含对正则表达式的支持,因为曾经系统学习过正则表达式,所以基础内容略过,直接看python对于正则表达式的支持. 正则表达式的学习,见<Mastering Regular Expressions>(精通正则表达式) re模块的内容 最重要的一些函数 函数 描述 compile(pattern[,flags]) 根据包含正则表达式的字符串创建模式对象 search(pattern,string[,flags]) 在字符串中寻找模式 match(pattern,st

python基础教程_学习笔记20:标准库:一些最爱——os

标准库:一些最爱 os os模块为你提供了访问多个操作系统服务的功能. os和它的子模块os.path还包括一些用于检查.构造.删除目录和文件的函数,以及一些处理路径的函数. os模块中一些重要函数和变量 函数/变量 描述 environ 对环境变量进行映射 system(command) 在子shell中执行操作系统命令 sep 路径中的分隔符 pathsep 分隔路径的分隔符 linesep 行分隔符('\n','\r','\r\n') urandom(n) 返回n字节的加密强随机数据 os

python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列

标准库:一些最爱 集合.堆和双端队列 集合 集合Set类位于sets模块中. >>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> set(range(10)) set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 集合是由序列(或其他可迭代的对象)构建的.主要用于检查成员资格,因此,副本是被忽略的: >>> range(10)*2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9

python基础教程_学习笔记18:标准库:一些最爱——shelve

标准库:一些最爱 shelve Shelve唯一有趣的函数是open.在调用它的时候(使用文件名作为参数),它会返回一个Shelf对象,可以用它来存储内容.只需要把它当作普通的字典(但是键一定要作为字符串)来操作即可,在完成工作之后,调用它的close方法. 意识到shelve.open函数返回的对象并不是普通的映射是很重要的. >>> import shelve >>> s=shelve.open('a.txt') >>> s['x']=['a','