python的sys.path与模块引用

来源:互联网 发布:淘宝怎么发布虚拟宝贝 编辑:程序博客网 时间:2024/06/06 03:53

一个python脚本:

import sys

for i in sys.path:
    print i

输出:

>>> 
C:\Users\Administrator\Desktop\pythontest
C:\Python27\Lib\idlelib
C:\Windows\system32\python27.zip
C:\Python27\DLLs
C:\Python27\lib
C:\Python27\lib\plat-win
C:\Python27\lib\lib-tk
C:\Python27
C:\Python27\lib\site-packages
>>> 

以上输出是python的sys.path的路径列表,它是一个list。默认情况下python导入文件或者模块的话,他会先在sys.path里找模块的路径。如果没有的话,程序就会报错。

而且当前脚本的路径默认会在这个list里面,比如:C:\Users\Administrator\Desktop\pythontest。所以当前脚本import 模块(通常是脚本文件),如果是这个脚本当前目录的情况下,是不会报错的(报错信息:找不到模块)。


sys.path模块:


sys.path模块是动态的修改系统路径


1、模块要处于Python搜索路径中的目录里才能被导入,但我们不喜欢维护一个永久性的大目录,因为其他所有的Python脚本和应用程序导入模块的时候性能都会被拖累。


2、sys.path是个列表,所以在末尾添加目录是很容易的,用sys.path.append就行了。当这个append执行完之后,新目录即时起效,以后的每次import操作都可能会检查这个目录。如同解决方案所示,可以选择用sys.path.insert(0,…,这样新添加的目录会优先于其他目录被import检查。


3、即使sys.path中存在重复,或者一个不存在的目录被不小心添加进来,也没什么大不了,Python的import语句非常聪明,它会自己应付这类问题。但是,如果每次import时都发生这种错误(比如,重复的不成功搜索,操作系统提示的需要进一步处理的错误),我们会被迫付出一点小小的性能代价。为了避免这种无谓的开销,本节代码在向sys.path添加内容时非常谨慎,绝不加入不存在的目录或者重复的目录。程序向sys.path添加的目录只会在此程序的生命周期之内有效,其他所有的对sys.path的动态操作也是如此。


小例子:

test.py

import os
import sys


#import son #这里son.py不在test.py当前的路径内,所以系统找不到son模块,会报错。


def AppendPyPath(arg,dirname,filenames):
    if not '.svn' in dirname:
        #sys.path.insert(0, os.path.abspath(dirname))
        sys.path.append(os.path.abspath(dirname))
os.path.walk(os.path.abspath(""), AppendPyPath, None)


import son #这里不会报错,因为son的路径被添加到sys.path里面去了。


#打印sys.path
for i in sys.path:
    print i


#注意 os.path.abspath("") 这个函数是输出当前test.py所在的文件夹的路径

#os.path.walk 是遍历当前的文件夹,找到包括当前文件夹在内的所有子文件夹

例如当前文件夹是:C:\Users\Administrator\Desktop\pythontest

所有文件夹是如下:

>>> 
C:\Users\Administrator\Desktop\pythontest
C:\Users\Administrator\Desktop\pythontest\global
C:\Users\Administrator\Desktop\pythontest\pickle
C:\Users\Administrator\Desktop\pythontest\pickle\test
C:\Users\Administrator\Desktop\pythontest\pickle\test\test111
C:\Users\Administrator\Desktop\pythontest\pythonclass
>>> 


原创粉丝点击