【Python】sys.path.append动态添加搜索路径设置

来源:互联网 发布:腾讯数据分析师面经 编辑:程序博客网 时间:2024/05/17 07:52

转自:http://doudouclever.blog.163.com/blog/static/1751123102011722246231/

如何将路径“永久"添加到sys.path?

sys.path是Python的搜索模块的路径集,是一个list

可以在python 环境下使用sys.path.append(path)添加相关的路径,但在退出python环境后自己添加的路径就会自动消失了!

可以使用以下命令输入当前python 的搜索路径:

python -c"import sys;print '当前的python是:'+sys.prefix;print '\n'.join(sys.path)"

练习使用sys.path.append方法添加路径,显示退出python会消失!

python -c"import sys;print '当前的python是:'+sys.prefix;sys.path.append(r'E:\DjangoWord' ) ;print '\n'.join(sys.path)"

 

再次运行,会发现 自己添加路径E:\DjangoWord()不存在了!

 

python -c"import sys;print '当前的python是:'+sys.prefix;print '\n'.join(sys.path)"

 

为解决这个问题,可以有以下方法:

 

 

将自己做的py文件放到 site_packages 目录下:

 

下面命令显示了 site-packages 目录:

 

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib() "

 

 但是这样做会导致一个问题,即各类模块都放到此文件夹的话,会导致乱的问题,这一点是显而易见的。

 

 注意,也不创建子文件夹,再将自己的模块放到子文件夹解决问题,这会导致使用import 语句时错误。

 

 

使用pth文件,在 site-packages 文件中创建 .pth文件,将模块的路径写进去,一行一个路径,以下是一个示例,pth文件也可以使用注释:

 

# .pth file for the  my project(这行是注释)

E:\DjangoWord

E:\DjangoWord\mysite

E:\DjangoWord\mysite\polls

 

这个不失为一个好的方法,但存在管理上的问题,而且不能在不同的python版本中共享。

 

 

使用PYTHONPATH环境变量,在这个环境变量中输入相关的路径,不同的路径之间用逗号(英文的!)分开,如果PYTHONPATH 变量还不存在,可以创建它!

 

路径会自动加入到sys.path中,而且可以在不同的python版本中共享,应该是一样较为方便的方法。

 

关于与python相关的环境变量有那些,请参考:

 

http://docs.python.org/using/cmdline.html   在页面上找到PYTHONPATH

 

 

以下是该环境变量的描述:

 

PYTHONPATH?

 

Augment the default search path for module files. The format is the same as the shell’s PATH : one or more directory pathnames separated by os.pathsep (e.g. colons on Unix or semicolons on Windows). Non-existent directories are silently ignored.

 

In addition to normal directories, individual PYTHONPATH entries may refer to zipfiles containing pure Python modules (in either source or compiled form). Extension modules cannot be imported from zipfiles.

 

The default search path is installation dependent, but generally begins with prefix /lib/python version (see PYTHONHOME above). It is always appended to PYTHONPATH .

 

An additional directory will be inserted in the search path in front of PYTHONPATH as described above under Interface options . The search path can be manipulated from within a Python program as the variable sys.path .





转自:http://book.51cto.com/art/201005/198555.htm

动态地改变Python搜索路径


《Python Cookbook(第2版)中文版》第2章文件,本章呈现了操作文件中的数据以及操纵文件系统下的文件和目录的一些技术,还包括了处理特定的文件格式以及存档格式的内容,比如tar和zip格式。本节为大家介绍动态地改变Python搜索路径。

2.21  动态地改变Python搜索路径

感谢:Robin Parmar

任务

模块必须处于Python搜索路径中才能被导入,但你不想设置个永久性的大路径,因为那样可能会影响性能,所以,你希望能够动态地改变这个路径。

解决方案

只需简单地在Python的sys.path中加入一个"目录",不过要小心重复的情况:

  1. def AddSysPath(new_path):  
  2.       """ AddSysPath(new_path):给Python的sys.path增加一个"目录"  
  3.       如果此目录不存在或者已经在sys.path中了,则不操作  
  4.       返回1表示成功,-1表示new_path不存在,0表示已经在sys.path中了  
  5.       already on sys.path.  
  6.       """  
  7.       import sys, os  
  8.       # 避免加入一个不存在的目录  
  9.       if not os.path.exists(new_path): return -1  
  10.       # 将路径标准化。 Windows是大小写不敏感的,所以若确定在  
  11.       # Windows下,将其转成小写  
  12.       new_path = os.path.abspath(new_path)  
  13.       if sys.platform == 'win32':  
  14.             new_pathnew_path = new_path.lower( )  
  15.       # 检查当前所有的路径  
  16.       for x in sys.path:  
  17.             x = os.path.abspath(x)  
  18.             if sys.platform == 'win32':  
  19.                    xx = x.lower( )  
  20.             if new_path in (x, x + os.sep):  
  21.                    return 0  
  22.       sys.path.append(new_path)  
  23.       # 如果想让new_path在sys.path处于最前  
  24.       # 使用:sys.path.insert(0, new_path)  
  25.       return 1  
  26. if _ _name_ _ == '_ _main_ _':  
  27.       # 测试,显示用法  
  28.       import sys  
  29.       print 'Before:'  
  30.       for x in sys.path: print x  
  31.       if sys.platform == 'win32':  
  32.               print AddSysPath('c:\\Temp')  
  33.               print AddSysPath('c:\\temp')  
  34.     else:  
  35.               print AddSysPath('/usr/lib/my_modules')  
  36.       print 'After:'  
  37.       for x in sys.path: print x 

讨论

模块要处于Python搜索路径中的目录里才能被导入,但我们不喜欢维护一个永久性的大目录,因为其他所有的Python脚本和应用程序导入模块的时候性能都会被拖累。本节代码动态地在该路径中添加了一个"目录",当然前提是此目录存在而且此前不在sys.path中。

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

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