新的 venv 虚拟环境就像另一个已经存在的环境 [Python]

New venv Virtual Environment acts like another env which already exists [Python]

我在这个文件夹中安装了一个名为 env 的 venv:

|-- ScreenScraper
|   |-- backend
|   |-- docker-compose.yml
|   |-- env
|   `-- scraper_return

当我激活它时,它的行为就像此文件夹中另一个名为 venv 的环境:(最后)

|-- WebScraper
|   |-- __pycache__
|   |   |-- hello.cpython-37.pyc
|   |   `-- hello.cpython-38.pyc
|   |-- byob-profiles-rest-api-docker
|   |   |-- Dockerfile
|   |   |-- LICENSE
|   |   |-- README.md
|   |   |-- Vagrantfile
|   |   |-- docker-compose.yml
|   |   |-- hello_world.py
|   |   |-- requirements.txt
|   |   `-- src
|   |-- django-markdown-editor
|   |   |-- LICENSE
|   |   |-- MANIFEST.in
|   |   |-- README.rst
|   |   |-- __screenshot
|   |   |-- martor
|   |   |-- martor_demo
|   |   |-- push.sh
|   |   |-- requirements.txt
|   |   |-- runtests.py
|   |   |-- setup.cfg
|   |   |-- setup.py
|   |   `-- venv

例如,pip list 显示 venvpip install -U pip returns Requirement already up-to-date: pip in ./WebScraper/django-markdown-editor/venv/lib/python3.8/site-packages (20.0.2) 中安装的软件包。空 env 再次被激活。是BUG还是我理解错了什么?

正如我们在评论部分所确定的那样,您的问题不是因为错误设置了虚拟环境,但值得一提的是将来可能遇到此问题的其他人的可能解决方案。

从其他虚拟环境目录调用虚拟环境的问题是将虚拟环境目录从一个地方复制到另一个地方的常见症状。 这应该避免! 其背后的原因是 [venv_dir]/bin/activate 脚本中硬编码的 VIRTUAL_ENV 变量。因此,始终确保此变量指向有效目录。

OP 的解决方案

为了仅列出来自虚拟环境的包,您需要为pip freezepip list使用--local标志。您可以在文档中找到它:

-l, --local

If in a virtualenv that has global access, do not list globally-installed packages.

关键词是全局访问。 pip 不断查找虚拟环境之外的包的可能原因可能是 PYTHONPATHPATH 环境变量。检查它们。 pip 可以看到这些路径中的任何内容。