2007-07-25

 

Python Cookbook 2.21 动态修改Python搜索路径

需求:

只有当模块在Python的搜索路径中时,它们才能被引用.可是如果因此而设置巨大的搜索路径,很影响效率.因为我们需要动态调整搜索路径.

讨论:

我们只要简单的给sys.path添加目录就可以了,需要注意的是避免重复字段:

def AddSysPath(new_path):
    """ AddSysPath(new_path): adds a "directory" to Python's sys.path
    Does not add the directory if it does not exist or if it's already on
    sys.path. Returns 1 if OK, -1 if new_path does not exist, 0 if it was
    already on sys.path.
    """
    import sys, os
    # Avoid adding nonexistent paths
    if not os.path.exists(new_path): return -1
    # Standardize the path.  Windows is case-insensitive, so lowercase
    # for definiteness if we are on Windows.
    new_path = os.path.abspath(new_path)
    if sys.platform == 'win32':
        new_path = new_path.lower( )
    # Check against all currently available paths
    for x in sys.path:
        x = os.path.abspath(x)
        if sys.platform == 'win32':
            x = x.lower( )
        if new_path in (x, x + os.sep):
            return 0
    sys.path.append(new_path)
    # if you want the new_path to take precedence over existing
    # directories already in sys.path, instead of appending, use:
    # sys.path.insert(0, new_path)
    return 1
if _ _name_ _ == '_ _main_ _':
    # Test and show usage
    import sys
    print 'Before:'
    for x in sys.path: print x
    if sys.platform == 'win32':
          print AddSysPath('c:\\Temp')
          print AddSysPath('c:\\temp')
    else:
          print AddSysPath('/usr/lib/my _modules')
    print 'After:'
    for x in sys.path: print x

模块在被引用前,必须存在于Python的搜索路径中,而我们不能因此就给Python搜索路径添加巨多的项目,这样会影响别的Python应用程序的执行效率.本节采用的方法是动态给sys.path添加目录,而且这个目录必须是存在且sys.path中没有的.
sys.path是一个列表,所以很容易通过sys.path.append向它的后面添加元素,添加完毕后,Python会在新的搜索路径中依次搜索目录,这就是说,你可以使用sys.path.insert (0..),这样保证Python总是先搜索我们添加的目录.
如果给sys.path中添加重复目录或者无效的目录都没有问题,因为Python的import很聪明,能自动去除这些项.每次这样的问题发生的时候(如,遇到无效目录,或者重复目录,要处理系统报出的错误),都要花掉一点时间来处理.为了节约这些时间,本节给出的方法是避免给sys.path添加无效的或者重复的目录.这些添加的目录,只有在程序运行时有效,不会影响别的程序.


Comments: 发表评论



<< Home

This page is powered by Blogger. Isn't yours?