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

Override module in virtualenv with local directory

我是 python 的新手,运行 遇到了一个我无法解决的问题。我有一个依赖于模块 B 的模块 A。通常,A 下载 B 并将其与其余的鸡蛋一起存储在我的 virtualenv 站点包中。现在,我有一个本地版本的 B,我想使用它来代替这个下载的 B 版本,但无论我做什么,A 仍然在其站点包中使用 B,而不是我在 PYTHONPATH 中指定的那个。

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

如果我打开 ipython 并在 PYTHONPATH 前面加上本地 B,我会看到我的 sys.path 首先列出站点包版本, 然后 我的 PYTHONPATH 中的目录。如果我做一些骇人听闻的事情,比如颠倒 sys.path 的顺序并尝试加载 B,它 仍然 使用站点包中的 B。我发现解决这个问题的唯一方法是从我的站点包中的 B 创建一个 sym link 到我的本地 B 并删除我本地 B 中的所有 *.pyc 文件。只需要是一个更好的方法来做到这一点......任何帮助都会很棒。谢谢!

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

在查看当前目录之前,

Python 将始终在您的安装目录(站点包)中查找包。 If/When 它在安装目录中找到了一个包,它停止寻找。

如果您想这样做,您可以明确引用您的本地副本。

from . import ModuleB
from .. import ModuleB
#etc

如果您正在处理一对相互依赖的相关项目,您只需卸载 "remote" 版本并使用 pip install -e 从本地副本安装它 editable mode

这将使您的依赖项目看到它,并自动看到对上游项目的更改,无需任何额外工作。