sys这个模块提供了一些能被解释起支持使用的变量和一些函数,这些函数与解释器能很好的结合,他们都是有用的。
1:argv
传递给python脚本的命令行参数列表,argv[0]是脚本的名字(不管他是一个路径全名或不是),如果使用了 -c 参数选项,argv[0]会被设置为字符串';-c';,如果没有脚本名传递给python解释器,argv[0]的长度为0。
2:byteorder
本地字节规则的指示器,big-endian平台的值是';big';,little-endian平台的值是';little';,我猜大概意思是值,有的系统读取字节的时候从高位读,有的从低位开始读,所以就出现了这个变量。
3:builtin_module_names
一个字符串的元组,这些字符串代表着所有被编译进解释器的模块的名字(这些信息通过别的途径是不能得到的,--modules.keys()只会得到所有导入的模块的名字的列表而已)
4:copyright
不用解释了吧,但他也是个量,里面记录着一些版权相关的冬冬
5:dllhandle
一个整数能代表python对于windows平台的DLL的操纵==不懂。。==
6:displayhook(value)
如果value非空,这个函数会把他输出到sys.stdout,并且将他保存进__builtin__._,先开始有点不懂,后来看到';_';就明白了,他是指在python的交互式解释器里,';_';代表上次你输入得到的结果,hook是钩子的意思,将上次的结果钩过来,和~~,原来他不但是内置的,而且他的真正位置原来是sys模块的,和~~
7:excepthook(type,value,traceback)
这也是个钩子,用来钩出当出现错误时,代表错误的三个属性。即:错误的类,错误的实体对象和trackback对象,比如说:
>>> 1/0
Traceback (most recent call last):
File "", line 1, in -toplevel-
1/0
ZeroDivisionError: integer division or modulo by zero
还有在一段交互式的代码段里,他会在下一个提示符输出前发生,而在一个python程序里,他会在程序结束的时候发生,较高级别的错误处理(即如果自己需要)可以通过自己构造一个象这样的三参数函数来处理。
8:__displayhook__;;__excepthook__
这些对象包涵了在程序开始的时候displayhook,excepthook的原始值,他们的存在是以便当程序出错后能够重现错误的详细信息,==大概是为了存储错误信息而设立的变量吧,==
>>> print sys.__displayhook__
看来他是内置函数
9:exc_info()
收集了当前指向的错误的错误信息,三个值的元组,返回的信息是当前线程和当前堆栈帧的细节,如果当前堆栈帧没错误,那回正在被调用的堆栈帧的信息,也就是说他的调用会一直持续到他发现错误为止。
如果至尾都没发现错误,返回的元组的三个值==None,(type,value,traceback)
如果exc_clear()被调用了,exc是exception,他会返回三个None,直到当前线程的另外一个错误产生了,或者the execution stack returns to a frame where another exception is being handled. ==不懂这句==
这里还有个warning:通过函数将traceback的返回值赋给本地的一个变量想操纵错误信息会引起递归调用,==大概是无限的吧==,这会阻止这个函数调用其他的变量,或者会阻止败类收集器收集败类,==这样内存大概不能得到释放吧==,所以这里有个建议:因为大多数函数都不会用到traceback,所以最好的办法是使用那些想exctype,value = sys.exc.info()[:2]来导出前两个信息,如果确实需要用到traceback,那么你最好在使用过后删除他(最好是用:try...finally),或者调用exc_info()的时候不用这个函数来操作exception。
这里还有个NOTE:从2.2版开始,象这些无限循环会自动被败类收集器回收的,所以你所调用的这样得到函数会得不到你想要的那些功能,但能避免则避免之最好·~
10:exc_clear()
这个函数是用来清除当前线程所出现的当前的或最近的错误信息的,调用后exception的三个信息当然是None了,但当调用过后再出现错误,他就管不到了,
这个函数通常使用的很少,这些很少的情况自己感兴趣可以看看
11:exc_type;;exc_value;;exc_traceback
这三个就是上面提到的那三个错误信息的参数了,需要注意的是,因为他们是全局变量,所以他们不是专门属于哪个线程的,在多线程的程序里要注意 安全 拉。。如果没有如何错误被操纵,exc_type是None,其他两个没有定义
12:exec_prefix
是一个字符串,内容是平台的python文件安装的位置,默认的是';/usr/local';==大概是对linux系统而言的吧==,他可以在安装python的时候设置,configure脚本里添上--exec-prefix参数,具体点,所有的configuration文件(如:pyconfig.h头文件)都在这个目录下:exec_prefix + ';/lib/pythonversion/config';,而共享库模块在:exec_prefix + ';/lib/pythonversion/lib-dynload';下,此处的version等同于version[:3]
13:executable
一个字符串,给出可以供python解释器执行的二进制文件的名字,二进制代码在哪个系统中都是可执行的,
14:exit([arg])
从python中退出,其实就是丢出SystemExit错误,然后清除一切,不过try...finally块里的finally还是要执行,然后才退出,所以在这个块里可以截获exit,===这里我不知道在finally块里截获还是在外层的块里就可以截获====可选参数arg可以是整数,标志exit的状态(默认的是0),也可以是其他对象,如果是整数0表示正常中止,如果是非0的,表示异常中止,大部分系统要求他的值在0-127之间,如果是没定义的冬冬,将会导致其他的结果,有些系统有不同的方式去定义exit命令,但是这些都是不怎么流行的,也就是不被人使用的;Unix程序一般使用2表示命令行语法错误,1表示所有的其他错误。。如果其他类型的对象作为arg。None等同于0,其他的会在标准输出终端(sys.stderr)输出,并且exit的arg置为1,特别的,当一个error产生时,sys.exit("错误信息")是一个快速退出程序的方法。
15:exitfunc
这个值没有被sys模块确切的定义,但是可以被你自己或者由一个程序设定,用来在程序退出的时候作一些收尾动作,当设置的时候要注意,他必须是一个无参函数,这个函数将在结束解释器的时候调用,而且也只能有一个这样的函数,如果想要引用多个函数,最好使用anexit模块,不然会中止不给执行。
注意:这个函数只有在程序退出的时候,或者python解释器产生了一个致命的内部错误,再或者当os.exit()被调用的时候才被执行。
16:getcheckinterval
返回由 setcheckinterval()设置的值,看下面的set..
17:getdefaultencoding()
返回当前你所用的默认的字符编码格式,
>>> sys.getdefaultencoding()
';ascii'; 我默认用的是ascii
18:getdlopenflags()
对unix有用,返回调用dlopen()得到的当前flags值,flag常量在dl和DLFCN模块中有定义,
19:getfilesystemencoding()
>>> sys.getfilesystemencoding()
';mbcs'; #windowsxpsp2+得系统
返回将Unicode文件名转换成系统文件名的编码的名字,值取决于系统,如果你的系统用的是Unicode,他的值是None,下面有介绍::
On Windows 9x, the encoding is ``mbcs';';.
On Mac OS X, the encoding is ``utf-8';';.
On Unix, the encoding is the user';s preference according to the result
of nl_langinfo(CODESET), or None if the nl_langinfo(CODESET) failed.
On Windows NT+, file names are Unicode natively, so no conversion is performed.
getfilesystemencoding still returns ``mbcs';';, as this is the
encoding that applications should use when they explicitly want
to convert Unicode strings to byte strings that are equivalent when used as file names.
20:_getframe([depth])
通过这个函数可以得到一个depth深度的堆栈(已经存在的)的引用,如果depth大于这个堆栈的深度,那么抛出ValueError,depth默认是0,返回这个帧的顶层指针,===我猜的,大概应该也许可能是这样吧====
21:getwindowsversion()
顾名思义吧
>>> sys.getwindowsversion()
(5, 1, 2600, 2, ';Service Pack 1';)#靠,竟然是sp1,我在上面还说我的是sp2+呢,大概我是通过
#sp1加补丁升级到sp2+相同的功能吧
这里有个列表:
VER_PLATFORM_WIN32s Win32s on Windows 3.1
VER_PLATFORM_WIN32_WINDOWS Windows 95/98/ME
VER_PLATFORM_WIN32_NT Windows NT/2000/XP
VER_PLATFORM_WIN32_CE Windows CE
22:hexversion
>>> sys.hexversion
33817025
这是我得到的结果,不知道干什么用的,16进制版本??是不是说版本用16进制数表示的啊?再来一个:
>>> hex(sys.hexversion)
';0x20401c1';
23:last_type;;last_value;;last_traceback
这三个怎么跑到这儿来了,干什么的??
这三个变量不总是存在的,当一个错误出现,在输出端也输出了却没有得到处理时他们就是那个错误的存储地了,他们最有可能用到的地方就是调试了,==你每天在IDLE里看到的红字错误就是调试了==,这里还介绍了一些东西我不知道了:
and engage in post-mortem debugging without having to re-execute the command that caused the error. (Typical use is "import pdb; pdb.pm()" to enter the post-mortem debugger; see chapter 9, ``The Python Debugger,';'; for more information.)
>>> import pdb
>>> pdb.pm()
> (1)?()
(Pdb) dsf
*** NameError: name ';dsf'; is not defined
(Pdb) x=0
(Pdb) x
0
(Pdb) 1/0
*** ZeroDivisionError: integer division or modulo by zero
有谁知道的说两句撒~~~如果想退出 ctl+D拉
24:maxint;;maxunicode
>>> sys.maxint
2147483647
>>> sys.maxunicode
65535
这里就不介绍了
25:modules
是个字典,里面是映射的是已经导入的模块的名字和他的路径,这个对重载模块有帮助,注意:从这个字典里移除模块不同于从相应模块对象里调用reload(),==也许翻译的不对==
26:path
一个链表,详细的描述了搜索模块的路径,被环境变量PYTHONPATH初始化,默认的增加一个的安装路径。
当程序开始进行初始化的时候,这个链表的第一项path[0],是包涵调用程序的解释器的脚本的文件路径,如果脚本路径不可用(如:解释器交互地调用,或者脚本从标准输入端读取),path[0]是一个空字符串,他告诉python首先在当前文件夹去寻找模块,需要注意的是脚本路径先入口路径插入PYTHONPATH==此处不懂==
任何程序可以随意修改这个链表以达到自己的目的,2.3有修改,Unicode字符串不再做忽略处理
27:platform
一个字符串标志表示系统平台的标志,例如:';sunos5';,';linux1';,这个信息可以用来指导你该添加些特定平台的构件,
28:prefix
一个字符串给出特定平台下,python被安装的路径前缀,默认的是';/user/local';,这个可以在安装python的时候加上 --prifix参数来配置脚本,python模块库的主收藏夹是 prefix+';/lib/pythonversion';,而平台的头文件被存在 prefix+';include/pythonversion';这里的version等于version[:3]
29:ps1;;ps2
他们是字符串,一个是主提示符,一个是次提示符,这些只在解释器交互模式下才能起作用,他们的默认值是';>>>'; and ';...';,但是在IDLE下好像不起作用,在xp的伪DOS下运行python会立即得到效果,总之通过他们可以修改提示符的显示
30:setcheckinterval(interval)
用来设置解释器的“检测时间间隔”,这个整数值决定了解释器检测周期性的事情如线程,信号等的频率,默认的是100,意思是指他会在每100个python虚拟指令周期进行检测,加大数值可能会加长程序使用线程的时间,设为<=0的数的话,他会在每个可用的指令周期进行检测
31:setdefaultencoding(name)
用来设置当前默认的字符编码,如果name和任何一个可用的编码都不匹配,抛出LookupError,这个函数只会被site模块的sitecustomize使用,一旦别site模块使用了,他会从sys模块移除
32:setdlopenflags(n)
设置flags(被dlopen( )调用),例如当解释器导入外部模块时。对于其他情况:调用sys.setdlopenflags(0),当导入模块时可以懒散的解析符号,==这里不懂,按字面翻译的===,调用sys.setdlopenflags(dl.RTLD_NOW|dl.RTLD_GLOBAL)可以跨模块共享符号,这里的n可以从dl模块得到帮助,或者从DLFCN模块得到帮助,如果DLFCN不可用,他可以使用h2py脚本从/usr/include/dlfcn.h产生,对unix可用
33:setprofile(profilefunc)
设置系统的配置(不知道这里的profile function时什么意思,也许是模拟,大概是对系统函数的调用接口进行python化的转变吧)函数,通过他可以得到系统函数python式的源代码,系统的profile function的调用有点类似系统的跟踪函数(参考 settrace()),但是他不会调用可执行的行代码(只是调用然后返回结果,就算是已经设置了一个错误,他也会执行返回事件),这种函数是一个特殊的线程,但是不能把他当线程,因为你没办法控制他和别的线程之间联系,因此在使用多线程面前是没有意义的,另外,its return value is not used,因此他能简单的返回None,profile参考第10章
34:setrecursionlimit(limit)
设置解释器递归调用时最多可以使用的堆栈的深度,这样可以阻止那些无限递归导致溢出,这个limit值时平台的,如果一个程序需要深度递归并且平台也支持大值的limit时你可以将limit值设置大点,但需要注意的是,如果太大了的话,会导致系统资源占尽从而崩溃。
|