【问题标题】:Why can't Pipenv find the correct version of python for my venv?为什么 Pipenv 无法为我的 venv 找到正确的 python 版本?
【发布时间】:2021-11-07 23:15:31
【问题描述】:

我需要一些帮助来解决我的一个 venvs 遇到的问题。

TLDR

使用pipenv 创建的全新虚拟环境,运行pipenv run python --version 会返回以下消息以及错误的python 版本:

Warning: the which -a system utility is required for Pipenv to find Python installations properly.
  Please install it.
Python 3.9.7 <--- this should be 3.8.5

激活虚拟环境然后运行python --version 会显示正确的版本,但这会阻止我在未激活venv 的情况下通过pipenv run &lt;any command&gt; 运行任何东西,并且还会让人怀疑有些事情不太正确。这是在 MacOS Big Sur 11.6 上

我的过程

  1. pyenv install 3.8.5安装我想要的python版本:
$ pyenv install 3.8.5                                                             
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.8.5.tar.xz...
-> https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tar.xz
Installing Python-3.8.5...
python-build: use tcl-tk from homebrew
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.8.5 to /Users/<me>/.pyenv/versions/3.8.5

pyenv versions的输出:

* system (set by /Users/<me>/.pyenv/version)
  3.6.4
  3.6.7
  3.8.12
  3.8.5
  3.9.1
  1. 创建新环境并使用 pipenv install --dev 从 Pipfile 安装 reqs。 Pipfile 包含
[requires]
python_full_version = "3.8.5"

输出:

Creating a virtualenv for this project...
Pipfile: /Users/<me>/dev/<project>/Pipfile
Using /Users/<me>/.pyenv/versions/3.8.5/bin/python3.8 (3.8.5) to create virtualenv...
⠦ Creating virtual environment...created virtual environment CPython3.8.5.final.0-64 in 325ms
  creator CPython3Posix(dest=/Users/<me>/.local/share/virtualenvs/<project>-OYt9MQn5, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/<me>/Library/Application Support/virtualenv)
    added seed packages: pip==21.1.2, setuptools==57.0.0, wheel==0.36.2
  activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator

✔ Successfully created virtual environment! 
Virtualenv location: /Users/<me>/.local/share/virtualenvs/<project>-OYt9MQn5
Installing dependencies from Pipfile.lock (62a518)...
  ????   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 108/108 — 00:00:50
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
  1. 尝试运行pipenv run python --version(它会找到错误的):
$ pipenv run python --version
Loading .env environment variables...
Warning: the which -a system utility is required for Pipenv to find Python installations properly.
  Please install it.
Python 3.9.7
  1. 激活 shell,然后运行上述命令(具有相同的输出),或者只运行 python --version,因为 shell 现在已激活,它会找到正确的版本:
(<project>) $ pipenv shell 
Courtesy Notice: Pipenv found itself running within a virtual environment, so it will automatically use that environment, instead of creating its own for any project. You can set PIPENV_IGNORE_VIRTUALENVS=1 to force pipenv to ignore that environment and create its own instead. You can set PIPENV_VERBOSITY=-1 to suppress this warning.
Loading .env environment variables...
Launching subshell in virtual environment...
 . /Users/<me>/.local/share/virtualenvs/<project>-OYt9MQn5/bin/activate
N/A: version "N/A -> N/A" is not yet installed.

You need to run "nvm install N/A" to install it before using it.
 $  . /Users/ckz8780/.local/share/virtualenvs/<project>-OYt9MQn5/bin/activate
(<project>) $ python --version 
Python 3.8.5
(<project>) $

FWIW,我以完全相同的方式(或者我认为)创建了其他几个 venv,它们工作正常。在那些 venv 中,当我在 venv 停用的情况下运行 pipenv run python --version 时,which -a 错误不存在,他们找到了正确的 python 版本。事实上,即使我在这些 venv 中激活 shell 并运行 pipenv run python --version,它仍然可以正常工作并找到正确的。这些 venv 的唯一区别是 python 版本(两个使用 python v3.6.x,两个使用 python v3.8.9)。它们都按预期工作,但是无论我做什么,这个似乎都找不到正确的版本。我正在拔头发。

非常感谢任何帮助!!!

谢谢

【问题讨论】:

    标签: python pipenv pyenv


    【解决方案1】:

    在安装 Python(同时使用 Pyenv 和 Pipenv)时,我有类似的工作流程。

    这对我有用:

    1. 使用 Pyenv 安装新的 Python 版本:
    pyenv install 3.9.0
    
    1. 运行 pyenv shell
    pyenv shell 3.9.0
    
    1. 在 pyenv shell 中通过 pip 安装 pipenv
    pip install pipenv
    
    1. 使用 pipenv 安装包 ...
    pipenv install ...
    
    1. 最后通过 Pipenv 创建一个使用 Pyenv 的 Python 版本的 virtualenv:
    pipenv shell 3.9.0
    

    输出:

    Pipfile: /Users/fabianmeyer/Desktop/analytics/Pipfile
    Using /Users/fabianmeyer/.pyenv/versions/3.9.0/bin/python3.9 (3.9.0) to create virtualenv...
    ⠹ Creating virtual environment...created virtual environment CPython3.9.0.final.0-64 in 1824ms
      creator CPython3Posix(dest=/Users/fabianmeyer/.local/share/virtualenvs/analytics-GC4g190F, clear=False, no_vcs_ignore=False, global=False)
      seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/fabianmeyer/Library/Application Support/virtualenv)
        added seed packages: pip==22.0.3, setuptools==60.6.0, wheel==0.37.1
      activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator
    
    ✔ Successfully created virtual environment! 
    Virtualenv location: /Users/fabianmeyer/.local/share/virtualenvs/analytics-GC4g190F
    

    【讨论】:

      【解决方案2】:

      pipenv GitHub issue复制答案:

      这不是 pipenv 的工作方式,你不能调用它来运行某些东西 在它管理的 virtualenv 中。 Pipenv 安装在外部 virtualenv,这意味着您使用 pipenv run 的方式与您使用的方式相同 pipenv install — 无需直接激活环境。 这就是 pipenv 存在的部分原因,这样您就不必 激活环境,甚至担心它们可能在哪里——这是 为您处理。

      因为 pipenv 没有安装在它管理的环境中,所以这个 说得通。我将关闭这个问题,因为它不是问题 使用 pipenv 并且由于此信息包含在一堆其他信息中 问题

      【讨论】:

      • 嗨,亚历克斯,感谢您的回复。我确实发现了这个问题,并想要求更多澄清,但不幸的是他们锁定了它,所以我无法回应。我认为这不适用于这种情况,因为我不想在我的虚拟环境中运行pipenv run。我正在运行它没有激活venv,所以我的印象是它会激活venv,然后在其中运行命令。这不准确吗?如果这不对,为什么它对我所有其他 venv 都有效?
      猜你喜欢
      • 2021-06-28
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 2018-08-12
      相关资源
      最近更新 更多