Python库的使用之-Sys模块

Python标准库之sys模块使用详解,讲解了使用sys模块获得脚本的参数、处理模块、

使用sys模块操作 模块搜索路径、使用sys模块查找内建模块、使用sys模块查找已导入的模块,重定向输出以及重定向错误等使用案例

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

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

【1】使用sys模块获得脚本的参数(给程序在外部传递参数):

test.py文件:

#!usr/bin/env python  
#coding:utf-8  
import sys  
print 'sys.argv=',sys.argv  
print 'The 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 is no argument!'  

  运行结果:

song@ubuntu:~$ python test.py

sys.argv= ['test.py']

The script name is test.py

There is no argument!

song@ubuntu:~$ python test.py argument1 argument2

sys.argv= ['test.py', 'argument1', 'argument2']

The script name is test.py

There are 2 arguments!

argument1

argument2

song@ubuntu:~$

【2】如果是从标准输入读入脚本, 脚本的名称将被设置为空串。

song@ubuntu:~$ python < test.py

sys.argv= ['']

The script name is

There is no argument!

【3】如果把脚本作为字符串传递给python (在命令行下选用 -c 选项), 脚本名会被设置为 "-c"。

song@ubuntu:~$ python -c "import sys;print sys.argv;print sys.argv[0]" arg1 arg2

['-c', 'arg1', 'arg2']

-c

song@ubuntu:~$

如果大家不明白,可以参考下man python

SYNOPSIS

python [ -d ] [ -E ] [ -h ] [ -i ] [ -m module-name ] [ -O ]

[ -Q argument ] [ -S ] [ -t ] [ -u ]

[ -v ] [ -V ] [ -W argument ] [ -x ]

[ -c command | script | - ] [ arguments ]

处理模块:

我们在使用模块的某一个功能前,需要用import,__import__命令导入。

那我们在执行import module_name的时候,python内部发生了什么呢?

简单的说,就是搜索module_name。根据sys.path的路径来搜索module.name

>>> import sys  
>>> sys.path  
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']  
>>>  

  我们以后写好的模块就可以放到上面的某一个目录下,便可以正确搜索到了。当然也可以添加自己的模块路径。sys.path.append(“my module path”)。

>>> sys.path.append('my module path')  
>>> sys.path  
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', 'my module path']  
>>>   

  

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

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

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

【4】操作sys模块中的搜索路径:

path.py文件:

#!usr/bin/env python  
#coding:utf-8  
import sys  
print 'sys.path=',sys.path  
print 'sys.path has',len(sys.path),'members.'  
sys.path.insert(0,'/tmp')  #将路径插入到path[0]中  
print 'sys.path=',sys.path  
print 'sys.path has',len(sys.path),'members.'  
sys.path=[]  #删除path中所有路径  
print 'sys.path=',sys.path  
print 'sys.path has',len(sys.path),'members.'  
#上述对sys.path的修改,仅仅在当前文件中有效,并不会修改python标准库中的sys模块。。。  

  运行结果:

song@ubuntu:~$ python path.py

sys.path= ['/home/song', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']

sys.path has 12 members.

sys.path= ['/tmp', '/home/song', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']

sys.path has 13 members.

sys.path= []

sys.path has 0 members.

【5】使用sys模块查找内建模块:

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

find_module.py文件:

def find_module(module):  
    print module,'=>',  
    if module in sys.builtin_module_names: #查找内建模块是否存在  
        print '<biultin>'  
    else:  
        mod=__import__(module) #非内建模块 输出模块路径  
        print mod.__file__  
  
import sys  
print 'sys.builtin_module_names=',sys.builtin_module_names  
find_module('os')  
find_module('sys')  
find_module('string')  
find_module('strop')  
find_module('zlib')