Windows上的virtualenv:未覆盖已安装的包

4 投票
2 回答
1699 浏览
提问于 2025-04-15 23:28

我现在的环境是 Windows 上的 Python 2.5 和 Django 1.1.1。我想在一些项目中开始使用 Django 1.2,但并不能在所有项目中都用上它。这正是我用 virtualenv 的原因。不过,我遇到了一个我从未碰到过的问题,网上也很难找到答案:在虚拟环境中安装 Django 1.2 对我来说没有任何效果。如果我激活这个环境,然后输入:

  • python
  • import django
  • django.VERSION

我得到的结果是 "1.1.1 Final"。Django 确实安装在我环境的 site-packages 目录里,根目录下的 init 文件显示它是 1.2。但即使我用 --no-site-packages 标志创建环境,环境还是回退到 1.1.1。我到底哪里搞错了?

2 个回答

2

你可以使用一些工具来诊断这些问题:

要查看django的来源,可以打印 django.__file__。这样会显示一个文件路径,告诉你django在电脑上的位置。

要查看Python会在哪里寻找包,可以打印 sys.path。这会给你一个目录的列表。

要实时查看导入的情况,可以用 python -v 启动Python,这样你会看到很多关于包导入的调试信息。

9

根据你在bitbucket上提交的bug,看起来你正在使用PYTHONPATH这个环境变量来指向一个包含一些包的目录,其中包括Django 1.1.1。PYTHONPATH的设计是这样的:它总是在你的sys.path的最前面,即使你激活了虚拟环境(因为PYTHONPATH是你直接控制的,人们用它来进行本地的覆盖)。

在这种情况下,如果你不想在激活这个虚拟环境时使用PYTHONPATH,你需要自己处理这个问题;也许可以创建一个自定义的批处理文件,这个文件既调用虚拟环境的activate.bat,又修改PYTHONPATH。

撰写回答