【问题标题】:pipenv deleted libraries from my virtual environment?pipenv 从我的虚拟环境中删除了库?
【发布时间】:2021-01-15 12:47:42
【问题描述】:

我正在使用 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 仍按预期列出所有要求。那么它们是如何从我的虚拟环境中删除的呢?

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

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

【问题讨论】:

    标签: python pipenv requirements pipfile


    【解决方案1】:

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

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

    • Pipeenv 自动将项目映射到其特定的 virtualenvs。
    • 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$ 
    

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

    现在开始:

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

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

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

    如前所述,这里的虚拟环境文件夹是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
    

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

    【讨论】:

      猜你喜欢
      • 2021-06-03
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      • 2020-10-18
      • 2022-08-18
      相关资源
      最近更新 更多