如何在虚拟环境中强制安装软件包?

5
尝试安装与系统不同版本的Django时,它会显示以下内容:
Installing collected packages: Django
Found existing installation: Django 1.7.11
Not uninstalling django at /home/user/lib/python2.7, outside environment /home/user/webapps/v2_dev/venv

成功安装了Django-1.8.19

但实际上这是旧版本

尝试使用不同的命令:

./venv/bin/pip install Django==1.8.11

pip install Django==1.8.11

更新: 当我安装我的软件包时,它显示:

The required version of setuptools (>=16.0) is not available,
and can't be installed while this script is running. Please
install a more recent version first, using
'easy_install -U setuptools'.
(Currently using setuptools 3.1 (/home/user/lib/python2.7/setuptools-3.1-py2.7.egg))

当我进行升级操作时:
venv/bin/pip install --upgrade setuptools
Requirement already up-to-date: setuptools in ./venv/lib/python2.7/site-packages (40.5.0)

1
在pip命令的末尾添加“--upgrade”。 - ruddra
不行,不起作用。显示已安装,但“pip list”显示未安装。 - Taras
卸载该包并使用pip重新安装它,确保您删除所有与lib/site-packages....相关的文件夹。 - Lemayzeur
1
为什么它使用系统中的setuptools,而不是venv中的? - Taras
4个回答

18
我在寻找如何在virtualenv中强制安装某些东西,尽管它已经在全局Python中安装了时,看到了这篇文章。这种情况发生在使用--system-site-packages创建的虚拟环境中。
在这种情况下,对于某些软件包,即使我们可以共享全局版本的许多其他软件包,也有可能在虚拟环境中具有本地版本,例如pytest。然而,如果pip能够在系统站点中找到最新版本,则它将拒绝在虚拟环境中安装软件包。
解决方法是使用pip install --ignore-installed mypackage

5
我认为这应该是正确的答案。问题明确要求在虚拟环境中“强制安装包,尽管它已存在于系统全局包文件夹中”。因此,此答案提供了正确的解决方案。升级软件包,就像其他答案建议的那样,是错误的选择,因为这可能会更改requirements.txt中指定的软件包版本。 - Teodoro

7

不要像./venv/bin/pip install ...那样安装setuptoolsDjango,而是先激活您的虚拟环境,然后安装所需的软件包。

激活虚拟环境:

进入存放虚拟环境的文件夹(通常是项目的根目录),然后输入以下两个命令之一:

  • source venv/bin/activate (Unix 系统)
  • venv\Scripts\activate (Windows)

这将确保您不会混合安装在不同环境中的软件包。

强制重新安装软件包:

  • 可以通过添加--upgrade-U来进行简单升级
  • 可以通过添加--force-reinstall来强制重新安装软件包

在您的情况下(一旦环境被激活)

python -m pip install -U --force-reinstall setuptools Django

步骤如下:

  1. 停用并删除旧的虚拟环境
  2. 使用 python -m virtualenv venv(python 2)或 python -m venv venv(python 3)创建新环境。

    python 是你想在项目中使用的解释器。这是唯一一个可能需要使用例如 python3 或某个绝对路径的地方。稍后使用原样的代码。

  3. source venv/bin/activate

    激活虚拟环境

  4. python -m pip install -U pip

    如果出现 ImportError: No module named _internal 的问题,那么你可能正在使用旧版本的 pip。该问题在此处有描述。

  5. python -m pip install -U --force-reinstall -r requirements.txt

    -U --force-reinstall 在新环境的情况下有点过度,但不会造成任何伤害。

  6. 进入 manage.py 所在的位置,使用 python manage.py runserver 启动服务器。


通过从我的 requirements.txt 中删除一个包来解决问题,但仍然得到错误的版本...当我运行 pip freeze 时,它显示 1.8.11,但当我运行 runserver 时,它使用了另一个版本。当我写 'which python' 时,它显示我的路径 (venv/bin/python)...是否有任何优先级来使用哪个包? - Taras
它将使用来自活动环境的包。在运行python manage.py runserver之前,您确定已激活安装了新版本的setuptoolsDjango的环境吗?(活动环境的名称在终端中每行的括号中显示。在尝试运行服务器之前,您应该看到类似于*(venv) myName@myHost:/some/path$*的内容。) - machnic
当然有(venv),还尝试了 venv/bin/python backend/manage.py runserver,结果也是一样的。 - Taras
也许吧,但只要您在已激活的环境中运行所有命令,例如 python -m ...,系统路径就不会真正起作用。然而,您可能会在环境内部对 site-packages 造成一些混乱。您是否尝试过完全删除环境,设置一个新环境并使用 requirements.txt 重新安装所有软件包? - machnic
1
我在我的答案中添加了“逐步”部分。请尝试按照它的确切步骤进行操作,不要同时添加额外的步骤。如果这并没有帮助,那么请提供您使用的完整命令集及其输出。 - machnic
显示剩余4条评论

0
问题出在Webfaction VPS上。
需要在/home/username/webapps/appName/env/lib/python2中命名为空的文件sitecustomize.py。
这个空文件会覆盖他们的Python自定义设置之一,即包含~/lib/python2.7目录中的任何包。
您可能需要停用虚拟环境并重新激活它以使更改生效。

0

解决方法,但它有效!

在您的虚拟环境目录中更改 pyvenv.cfg 文件的属性。

include-system-site-packages = True

这将导致使用安装在主要位置的软件包


这恰恰与OP想要的相反:强制在虚拟环境内安装软件包,而不是安装到系统路径中。 - taffit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接