如何让Python自动选择正确的模块而不手动修改sys.path?
我在我的代码库中对一个Python模块做了一些修改,现在需要测试一下这些修改。但是,当我尝试运行一个使用这个模块的脚本时,它总是从代码库的主干部分导入这个模块,这对我来说没什么用。
我试着设置了PYTHONPATH,但完全没有效果。经过一番搜索,我发现site-packages目录下的.pth文件中的内容会在PYTHONPATH之前被加载(这让我觉得设置PYTHONPATH的意义就没了)。我认为这就是我的模块没有被识别的原因。
我这样理解对吗?如果对,那有什么办法可以覆盖这个问题(不修改脚本去加sys.path.insert(0,path)
)?
补充说明:回复NicDumz - 原来的代码库在/projects/spam
下。Python模块就在这个路径下的/projects/spam/sources/python/a/b/
。不过,这些模块是每晚用自制的构建工具“构建”的,然后放到/projects/spam/build/lib/python/a/b/
。脚本只使用这个最后路径下的模块。
我已经把整个代码库检出到/home/sundar/spam
,并在/home/sundar/spam/sources/python/a/b/mymodule.py
中做了修改。我把PYTHONPATH设置为/home/sundar/spam/sources/python
,然后尝试导入a.b.mymodule
,但没有成功。
4 个回答
你现在的工作目录在sys.path
的最前面。也就是说,那里的一切都会优先于sys.path
中其他地方的内容。
把“测试版本”复制到一个离sys.path
目录列表前面更近的地方,比如你的当前工作目录。
你可以写一个小脚本,比如下面这个,来在系统路径前面加上一些内容,然后设置PYTHONSTARTUP来使用这个脚本。
import sys
sys.path.insert(0, 'c:/temp')
比如说...
C:\temp>set PYTHONSTARTUP=c:\temp\tst.py
C:\temp>C:\Python26\python
Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['c:/temp', '', 'C:\\Python26\\lib\\site-packages\\setuptools-0.6c9-py2.6.egg',
'C:\\Python26\\lib\\site-packages\\pyyaml-3.08-py2.6-win32.egg', 'C:\\Python26\\
lib\\site-packages\\pyglet-1.1.3-py2.6.egg', 'C:\\Python26\\lib\\site-packages\\
simpy-2.0.1-py2.6.egg', 'C:\\Python26\\lib\\site-packages\\nose-0.11.1-py2.6.egg
', 'C:\\Python26\\lib\\site-packages\\mercurial-unknown-py2.6-win32.egg', 'c:\\t
emp', 'C:\\WINDOWS\\system32\\python26.zip', 'C:\\Python26\\DLLs', 'C:\\Python26
\\lib', 'C:\\Python26\\lib\\plat-win', 'C:\\Python26\\lib\\lib-tk', 'C:\\Python2
6', 'C:\\Python26\\lib\\site-packages', 'C:\\Python26\\lib\\site-packages\\win32
', 'C:\\Python26\\lib\\site-packages\\win32\\lib', 'C:\\Python26\\lib\\site-pack
ages\\Pythonwin']
听起来你需要安装 virtualenv,然后用它来为不同的目的设置不同的环境。在一个环境里,你可以从代码库的主干导入模块,而在另一个环境里,你可以混合使用主干模块和测试模块。
通过这样把所有东西分开,你可以更容易地撤销更改(只需删除整个虚拟环境文件夹),而且大大降低了你的测试代码被意外提交到代码库的风险。