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添加无效的或者重复的目录.这些添加的目录,只有在程序运行时有效,不会影响别的程序.
只有当模块在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添加无效的或者重复的目录.这些添加的目录,只有在程序运行时有效,不会影响别的程序.