提问者:小点点

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


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

它工作得很好,直到今天我注意到我不能使用python3app.py命令从shell中运行我的app.py。我从第1行得到了ModuleNotFoundError: No module name'flask'

当我运行哪个python3哪个pip3时,我看到了指定我在我的venv中的预期响应。当我运行pipsetuptools时,我只看到pip

这很奇怪,因为就在最近,一切都很好(1-2周前?),我确信我个人没有做任何会扰乱库/需求的事情。

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

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

更新:我刚刚意识到我确实更改了包含项目的文件夹的名称;我想这是原因。既然我已经重新下载了需求,这是否意味着我现在在某个地方存在重复项?如果是,在哪里?


共1个答案

匿名用户

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

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

  • Pipenv自动将项目映射到其特定的虚拟环境。
  • 虚拟环境与项目根目录的名称以及项目根目录的完整路径的哈希一起全局存储(例如,my_project-a3de50)。
  • 如果您更改项目的路径,您将破坏这样的默认映射,并且pipenv将不再能够找到和使用项目的虚拟环境。

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

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$ 

“创建一个虚拟环境……”意味着它正在创建一个新的。

现在,转到:

这是不是意味着我现在在某个地方有复制品?如果是,在哪里?

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

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

如前所述,这里的虚拟环境文件夹是demo2-4Y1NLH_X,顶级文件夹是(在我的例子中). venvs。默认值类似于 /.local/share/或您将WORKON_HOME设置为的任何内容(请参阅自定义虚拟环境位置)。只需为自己运行--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文件夹-hash本身获取原始的完整路径。(参见相关:如何在目录被删除时删除所有pipenv虚拟env?)。也没有办法重用旧的虚拟env并将其复制到新的。但无论如何你不需要,创建虚拟env成本低廉,只需重新创建它并重新安装所有以前的包。