Python 使用本地目录覆盖virtualenv中的模块

Python 使用本地目录覆盖virtualenv中的模块,python,python-2.7,virtualenv,python-module,Python,Python 2.7,Virtualenv,Python Module,我是python新手,遇到了一个我无法克服的问题。我有一个依赖于模块B的模块a。通常情况下,a下载B并将其和其他鸡蛋一起存储在我的virtualenv站点包中。现在,我有一个本地版本的B,我想用它来代替这个下载版本的B,但是不管我怎么做,a仍然在它的站点包中使用B,而不是我在PYTHONPATH中指定的那个 我知道我的本地B设置正确,因为如果我将它添加到PYTHONPATH中,并且我没有使用virtualenv,我就可以很好地使用它 如果我打开ipython并在PYTHONPATH前面加上本地B

我是python新手,遇到了一个我无法克服的问题。我有一个依赖于模块B的模块a。通常情况下,a下载B并将其和其他鸡蛋一起存储在我的virtualenv站点包中。现在,我有一个本地版本的B,我想用它来代替这个下载版本的B,但是不管我怎么做,a仍然在它的站点包中使用B,而不是我在PYTHONPATH中指定的那个

我知道我的本地B设置正确,因为如果我将它添加到PYTHONPATH中,并且我没有使用virtualenv,我就可以很好地使用它

如果我打开ipython并在PYTHONPATH前面加上本地B,我会看到my sys.path首先列出站点包的版本,然后是PYTHONPATH中的目录。如果我做了一些黑客行为,比如颠倒sys.path的顺序并尝试加载B,它仍然使用站点包中的B。我发现解决这个问题的唯一方法是创建一个从我网站包中的B到本地B的sym链接,并删除本地B中的所有*.pyc文件。必须有更好的方法来做到这一点。。。任何帮助都会很棒。谢谢大家!

我不确定这是否重要,但作为参考,我使用以下版本的东西:

  • virtualenv 12.1.1
  • python 2.7
  • 模块A和B是我公司的内部库
  • Ubuntu 12.04.5 LTS

Python将始终在您的安装目录(站点软件包)中查找软件包,然后再查找当前目录。如果/当它在install dir中找到一个包时,它将停止查找

如果您想这样做,可以显式引用本地副本

from . import ModuleB
from .. import ModuleB
#etc

如果您正在处理一对相关项目,其中一个项目依赖于另一个项目,您可以卸载“远程”版本,然后使用
pip install-e
从中的本地副本安装它


这将让您的从属项目看到它,并自动看到对上游项目的更改,而不需要任何额外的工作。

您可以卸载远程版本和
pip install-e
本地版本吗?您需要卸载包B(从您的站点包),然后确保您的本地副本B可以在(可从中导入)你的PYTHONPATH。@tzaman实际上工作得很好。当我更改本地版本时,我甚至不需要重新安装pip。我仍然希望找到PYTHONPATH为什么不工作的答案,但这是我手头任务的可行解决方案。谢谢!@LizBennett真棒!我已经发布了一个更详细的答案。比ks谢谢你的回答。我很惊讶没有办法覆盖这个行为。似乎只有这样才能加载我的本地版本(不使用你建议的语法)实际上是删除站点包中的内容。作为java land的人,从完全控制库的加载顺序到没有真正控制是很奇怪的。我唯一的问题是模块A依赖于包C版本1.3.6,而模块B也依赖于包C,但版本1.3.3。当我在处理模块A的VirtualNV中,我使用pip安装-e/path/to/B,它试图使用错误的C版本构建模块B,即当B需要1.3.3时使用1.3.6。为此,只需升级B的依赖项即可,但这可能并不总是一个选项。