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

转自: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的动态操作也是如此。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Python中,sys.path是一个列表,用于存储模块的搜索路径。当我们使用import语句导入模块时,Python会在sys.path中列出的路径搜索相应的模块。 使用sys.path.append()函数可以向sys.path列表中添加新的搜索路径。如果我们想要导入上级目录中的模块或子文件,就可以使用sys.path.append()函数添加上级目录的路径。 例如,假设我们有一个文件夹结构如下: ``` project/ module/ __init__.py module.py utils/ __init__.py utils.py main.py ``` 如果我们想在main.py中导入module.py和utils.py,就可以使用sys.path.append()函数添加相应的搜索路径: ```python import sys sys.path.append('../module') sys.path.append('../utils') import module # 导入module.py import utils # 导入utils.py ``` 在上面的代码中,我们将../module和../utils分别添加sys.path中,使得Python可以在这两个路径搜索相应的模块。 需要注意的是,使用sys.path.append()函数添加搜索路径并不会永久生效,只会在当前会话中有效。如果想要永久添加搜索路径,可以修改PYTHONPATH环境变量。 ### 回答2: python中,sys.path.append()是用来添加模块搜索路径的函数,使用该函数可以将所需的模块路径添加至系统模块搜索路径列表中。 sys.path.append() 是向sys.path列表末尾 添加一个模块搜索路径。在Python中,一个包package通常包含多个模块module,这些模块通常保存在同一个文件夹下,该文件夹就是这个包的目录。使用sys.path.append()函数可以将这个目录添加Python的模块搜索路径列表中,从而能够快速地找到该目录下的所有模块。 例如,我们在项目中需要使用上一级目录中的模块,此时可以使用sys.path.append()函数将上级目录添加到模块搜索路径列表中。具体实现可以按以下步骤进行: 1.使用os模块获取当前文件所在的目录路径,这可以通过os.path.dirname(__file__)函数来实现。 2.使用os.path.abspath()函数获取当前目录的绝对路径。 3.使用os.path.join()函数将当前目录的父目录与要添加路径拼接起来,即可得到上级目录中的路径。 4.使用sys.path.append()函数将上级目录路径添加至模块搜索路径列表中。 下面是一个简单的示例代码,假设我们需使用上级目录中的模块mymodule作为一个函数: ``` python import os import sys # 获取当前文件所在的目录路径 cur_path = os.path.dirname(__file__) # 获取当前目录的绝对路径 cur_path = os.path.abspath(cur_path) # 获取上一级目录的路径 parent_path = os.path.join(cur_path, '..') # 将上级目录路径添加sys.path列表末尾 sys.path.append(parent_path) # 导入上级目录中的mymodule模块 import mymodule # 调用mymodule中的函数 mymodule.myfunction() ``` 以上代码将上级目录路径添加到模块搜索路径列表中,因此可以成功地导入上级目录中的模块。其中,mymodule是上级目录中的模块,myfunction是mymodule模块中的一个函数。 ### 回答3: 在Python中,sys.pathPython搜索module的路径列表,所有在该列表中的路径下的module都可以被Python引入并使用。常见的情况是,我们需要使用自己或他人编写的库,但是这些库文件并不在Python内置库或Python安装目录下,而是放在自定义路径下,为了能够让Python找到这些库文件,就需要将这些路径添加sys.path中。 在添加路径时,不仅可以添加当前目录、Python内置库、Python安装目录等路径,还可以添加上级目录下的子目录路径,以此使Python可以直接找到这些包和模块。 使用sys.path.append()函数可以将路径添加sys.path中,可以添加绝对路径或相对路径。在添加上级目录子文件的路径时,可以使用os模块和os.path模块来获取指定路径的上级目录路径,并通过sys.path.append()来添加上级目录子文件的路径。 例如,我们可以在当前Python文件中添加上级目录子文件的路径方式如下: import sys import os #获取当前文件的路径 current_path = os.path.abspath(__file__) #获取当前文件的上级目录路径 current_dir = os.path.dirname(current_path) #获取上级目录的上级目录路径 parent_path = os.path.abspath(os.path.join(current_dir, "..")) #添加上级目录子文件 sys.path.append(parent_path) 这样,我们就可以通过Python的import语句直接引入上级目录子文件中的模块和子模块了。通过该方法,我们可以更方便地调用上级目录下子文件中的模块,使得项目的模块结构更加清晰合理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值