python sys.path是否像Unix PATH一样?

时间:2013-11-18 18:18:08

标签: python

假设我有一个本地开发目录,其中包含我正在编写的模块,以及一个系统级的site-packages目录,最终将安装这些模块。在我正在修改现有模块并且我想测试它的情况下,我想确保我导入的模块是我本地site-packages目录中的模块。阅读site模块,我可以看到一个带有.pth后缀的文件,其中该文件中的每一行都将附加到sys.path变量。我已经设置了,我可以确认我的开发目录稍后会出现在列表中,但是当我导入一个模块时,它会从系统目录中导入。

简化示例:

$ virtualenv test_sys
$ cd test_sys
$ source bin/activate
$ mkdir site_modules
$ mkdir user_modules

在每个site_modules和user_modules中,我在[{1}}中放置了一个名为test_module的目录,其中包含以下内容:

__init__.py

现在我已将import os print(os.path.abspath(__file__)) 文件添加到site_modules.pth

test_sys/lib/python2.7/site-packages

我希望当我从python解释器导入test_module时,它会打印/home/chris/test_sys/site_modules /home/chris/test_sys/user_modules 目录,但它不会:

user_modules

是的,我确保>>> import test_module /home/chris/test_sys/site_modules/test_module/__init__.pyc >>> 稍后会出现user_modules而不是sys.path

如何确保始终从特定目录导入site_modules中多个目录中存在的模块?

1 个答案:

答案 0 :(得分:1)

Python的sys.path主要像Unix PATH环境变量一样工作。他们都使用他们在路径中找到的第一个对象。因此,如果您希望user_modules覆盖site_modules,则必须先将放入,而不是第二

/home/chris/test_sys/user_modules
/home/chris/test_sys/site_modules

这与Unix PATH

相同
PATH=/usr/local/bin:/usr/bin:/bin

这意味着来自/usr/local本地包(未由包管理器安装)将覆盖/usr中的系统包。