我正在使用自制安装的pipenv
来管理Python项目的虚拟环境。我导航到我Python项目的文件夹并使用pipenv shell
命令激活venv。
它工作得很好,直到今天我注意到我不能使用python3app.py
命令从shell中运行我的app.py。我从第1行得到了ModuleNotFoundError: No module name'flask'
。
当我运行哪个python3
和哪个pip3
时,我看到了指定我在我的venv中的预期响应。当我运行pip
、setuptools
和轮
时,我只看到pip
。
这很奇怪,因为就在最近,一切都很好(1-2周前?),我确信我个人没有做任何会扰乱库/需求的事情。
Pipfile仍然按预期列出了所有需求。那么它们是如何从我的虚拟环境中删除的呢?
我知道我可以重新下载所有的需求;我只是好奇为什么会发生这种情况。
更新:我刚刚意识到我确实更改了包含项目的文件夹的名称;我想这是原因。既然我已经重新下载了需求,这是否意味着我现在在某个地方存在重复项?如果是,在哪里?
如果您移动/重命名了创建虚拟环境的文件夹,那么下次尝试在那里激活虚拟环境时,Pipenv将创建一个全新的虚拟环境。这是因为Pipenv根据项目目录的完整路径创建实际的虚拟环境文件夹。这在文档中注明:
https://pipenv-fork.readthedocs.io/en/latest/install.html#virtualenv-mapping-caveat
my_project-a3de50
)。强调第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成本低廉,只需重新创建它并重新安装所有以前的包。