假设我有一个本地开发目录,其中包含我正在编写的模块,以及一个系统级的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
中多个目录中存在的模块?
答案 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
中的系统包。