如何在不手动修改sys.path的情况下让Python选择正确的模块?

时间:2009-11-05 10:35:10

标签: python import path module

我在已检出的存储库副本中对python模块进行了一些更改,需要对它们进行测试。但是,当我尝试运行使用该模块的脚本时,它会继续从存储库的主干导入模块,这对我没用。

我尝试设置PYTHONPATH,它什么也没做。经过一番搜索后,我发现即使在PYTHONPATH之前,site-packages目录下的.pth文件中的任何内容都会被放入(这对我来说是不合适的)。我相信这是我的模块没被挑选的原因。

我说错了吗?如果是这样,有什么方法可以覆盖它(不修改脚本以获得sys.path.insert(0,path))?

编辑:回复NicDumz - 原始存储库位于/projects/spam下。 python模块是/projects/spam/sources/python/a/b/中的一部分。然而,这些都是使用自己开发的make变体每晚“建立”,然后将它们放入/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并尝试import a.b.mymodule但没有成功。

4 个答案:

答案 0 :(得分:3)

听起来您需要安装virtualenv并使用它来为不同目的设置不同的环境。在一个环境中,您将从存储库的主干导入模块,但在另一个环境中,您将混合使用主干模块和测试模块。

通过将所有内容保持为独立,您可以更轻松地回滚更改(只需删除整个虚拟环境文件夹),并且可以大大降低测试绑定最终被提交到存储库的风险。

答案 1 :(得分:2)

您可以编写一个小脚本,例如下面的脚本,它以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']

答案 2 :(得分:1)

您当前的工作目录位于sys.path的第一位。任何事情都胜过路上的其他事情。

将“测试版”复制到sys.path中靠近目录列表前面的某个位置,就像当前的工作目录一样。

答案 3 :(得分:0)

您可以使用setuptoolsdistribute创建设置脚本,然后执行python setup.py develop。它将在.pth文件中添加指向您的工作副本的链接,覆盖任何已安装的版本。

完成后,您只需删除.pth文件中的链接即可。