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