0

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

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

当我运行which python3andwhich pip3时,我看到了指定我在我的 venv 中的预期响应。当我跑步时,pip3 list我只看到pip和。setuptoolswheel

这很奇怪,因为就在最近一切正常(1-2 周前?),我很肯定我个人没有做任何会弄乱库/要求的事情。

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

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

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

4

1 回答 1

0

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

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

  • Pipenv 自动将项目映射到其特定的 virtualenvs。
  • virtualenv 以项目根目录的名称加上项目根目录的完整路径的哈希值(例如,my_project-a3de50)全局存储。
  • 如果您更改项目的路径,则会破坏这种默认映射,并且 pipenv 将不再能够找到和使用项目的 virtualenv。

强调第 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$ 

“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的任何值(请参阅自定义虚拟环境位置)。只--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

目前没有办法直接从虚拟环境文件夹哈希本身获取原始路径的完整路径。(参见相关:删除目录时如何删除所有 pipenv virtualenvs?)。也没有办法重复使用旧的虚拟环境并将其复制到新的虚拟环境中。但是无论如何您都不需要,创建虚拟环境很便宜,只需重新创建它并重新安装所有以前的包。

于 2021-01-19T14:11:22.377 回答