pipenv 从我的虚拟环境中删除了库?

时间:2021-01-15 12:47:42

标签: python pipenv requirements pipfile

我使用 Homebrew 安装的 pipenv 来管理 Python 项目的虚拟环境。我导航到我的 Python 项目的文件夹并使用 pipenv shell 命令激活 venv。

它一直运行良好,直到今天我注意到我无法使用 python3 app.py 命令从 shell 中运行我的 app.py。我从第 1 行得到 ModuleNotFoundError: No module named 'flask'

当我运行 which python3which pip3 时,我看到预期的响应,指定我在我的 venv 内。当我运行 pip3 list 时,我只看到 pipsetuptoolswheel

这很奇怪,因为最近一切都运行良好(1-2 周前?),而且我很确定我个人没有做任何会干扰库/要求的事情。

Pipfile 仍按预期列出所有要求。那么它们是如何从我的虚拟环境中删除的呢?

我知道我可以重新下载所有要求;我只是好奇为什么会发生这种情况。

更新:我刚刚意识到我确实更改了包含项目的文件夹的名称;我认为这是原因。由于我已经重新下载了要求,这是否意味着我现在在某处存在重复项?如果有,在哪里?

1 个答案:

答案 0 :(得分:0)

如果您移动/重命名了创建虚拟环境的文件夹,那么下次您尝试在那里激活虚拟环境时,Pipenv 将创建一个全新的虚拟环境。这是因为 Pipenv 会根据项目目录的完整路径创建实际的虚拟 env 文件夹。这在文档中注明:

https://pipenv-fork.readthedocs.io/en/latest/install.html#virtualenv-mapping-caveat

<块引用>
  • Pipenv 自动将项目映射到其特定的虚拟环境。
  • virtualenv 以项目根目录的名称加上项目根目录的完整路径的哈希值(例如,my_project-a3de50)全局存储。
  • 如果您更改项目的路径,则会破坏这样的默认映射,并且 pipenv 将无法再找到和使用项目的 virtualenv。

强调第三点。所以它没有删除你的包,它基本上创建了一个新的包。您还应该看到它正在创建一个新的通知:

demo$ pipenv shell
Launching subshell in virtual environment...
...

(demo) demo$ 
exit
demo$ cd ..
~$ mv demo demo2
~$ cd demo2

demo2$ pipenv shell
Creating a virtualenv for this project...
...

(demo2) demo2$ 

“Creating a virtualenv...”意味着它正在创建一个新的。

现在开始:

<块引用>

这是否意味着我现在在某处存在重复项?如果有,在哪里?

这意味着您仍然在某个地方拥有以前的虚拟 env 文件夹,您以前在其中安装了您的软件包。您可以尝试使用 --venv 选项来获取 Pipenv 创建所有虚拟 env 文件夹的顶级目录。在您的新环境中:

(demo2) demo2$ pipenv --venv
/Users/gino.mempin/.venvs/demo2-4Y1NLH_X

如前所述,这里的虚拟 env 文件夹是 demo2-4Y1NLH_X,顶级文件夹是(就我而言).venvs。默认值类似于 /.local/share/ 或您将 WORKON_HOME 设置为的任何内容(请参阅 Custom Virtual Environment Location)。只需自己运行 --venv

你可以尝试去那里,它会列出你创建的所有虚拟环境:

(demo2) demo2$ ls /Users/gino.mempin/.venvs
demo-tSf-ZA7f
demo2-4Y1NLH_X
some-other-project-ABJaje5
another-project-8WUmE08m
...

在这里,如果幸运的话,您可以找到旧文件夹的名称,如果要清理,只需将其删除即可。如果你不走运,会有多个同名文件夹,你将无法分辨哪个是你的旧文件夹。

(demo2) demo2$ ls /Users/gino.mempin/.venvs
demo-tSf-ZA7f
demo-7I2ki6rH
demo-8WUmE08m
demo2-4Y1NLH_X

目前无法直接从虚拟 env 文件夹散列本身获取原始文件的完整路径。 (见相关:How to remove all pipenv virtualenvs when the directory was deleted?)。也无法重用旧的虚拟环境并将其复制到新的虚拟环境中。但是无论如何您都不需要,创建虚拟环境的成本很低,只需重新创建它并重新安装所有以前的包即可。

相关问题