为什么Pipenv不选择我的Pyenv版本?

问题描述

我的系统Python版本是3.8.5,但是我使用pyenv来管理另一个版本3.6.0,以镜像项目所部署到的服务器版本。我以前使用virtualenv + virtualenvwrapper来管理我的虚拟环境,但是我在pipenv上听到了很多很棒的事情,并认为我会尝试一下。在尝试使用Python 3.6.0之前,一切都很棒。流是这样的:

$ mkdir test_project && cd test_project
$ pyenv shell 3.6.0
$ pipenv install django
Creating a virtualenv for this project…
Pipfile: /home/user/projects/test_project/Pipfile
Using /home/user/.pyenv/shims/python (3.6.0) to create virtualenv…
⠸ Creating virtual environment...created virtual environment Cpython3.8.5.final.0-64 in 130ms
  creator Cpython3Posix(dest=/home/user/.local/share/virtualenvs/test_project-eAvoynKo-/home/user,clear=False,global=False)
  seeder FromAppData(download=False,pip=bundle,setuptools=bundle,wheel=bundle,via=copy,app_data_dir=/home/user/.local/share/virtualenv)
    added seed packages: pip==20.2.3,setuptools==50.3.0,wheel==0.35.1
  activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator

✔ Successfully created virtual environment! 
Traceback (most recent call last):
  File "/home/user/.pyenv/versions/3.6.0/bin/pipenv",line 11,in <module>
    sys.exit(cli())
  File "/home/user/.pyenv/versions/3.6.0/lib/python3.6/site-packages/pipenv/vendor/click/core.py",line 829,in __call__
    return self.main(*args,**kwargs)
  File "/home/user/.pyenv/versions/3.6.0/lib/python3.6/site-packages/pipenv/vendor/click/core.py",line 782,in main
    rv = self.invoke(ctx)
  File "/home/user/.pyenv/versions/3.6.0/lib/python3.6/site-packages/pipenv/vendor/click/core.py",line 1259,in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/user/.pyenv/versions/3.6.0/lib/python3.6/site-packages/pipenv/vendor/click/core.py",line 1066,in invoke
    return ctx.invoke(self.callback,**ctx.params)
  File "/home/user/.pyenv/versions/3.6.0/lib/python3.6/site-packages/pipenv/vendor/click/core.py",line 610,in invoke
    return callback(*args,**kwargs)
  File "/home/user/.pyenv/versions/3.6.0/lib/python3.6/site-packages/pipenv/vendor/click/decorators.py",line 73,in new_func
    return ctx.invoke(f,obj,*args,line 21,in new_func
    return f(get_current_context(),**kwargs)
  File "/home/user/.pyenv/versions/3.6.0/lib/python3.6/site-packages/pipenv/cli/command.py",line 252,in install
    site_packages=state.site_packages
  File "/home/user/.pyenv/versions/3.6.0/lib/python3.6/site-packages/pipenv/core.py",line 1928,in do_install
    site_packages=site_packages,File "/home/user/.pyenv/versions/3.6.0/lib/python3.6/site-packages/pipenv/core.py",line 580,in ensure_project
    pypi_mirror=pypi_mirror,line 512,in ensure_virtualenv
    python=python,site_packages=site_packages,pypi_mirror=pypi_mirror
  File "/home/user/.pyenv/versions/3.6.0/lib/python3.6/site-packages/pipenv/core.py",line 986,in do_create_virtualenv
    with open(project_file_name,"w") as f:
FileNotFoundError: [Errno 2] No such file or directory: '/home/user/.local/share/virtualenvs/test_project-eAvoynKo-/home/user/.pyenv/shims/python/.project'

我遇到了上一个问题Pipenv not recognizing Pyenv version?,并在我的pipenv_PYTHON="$PYENV_ROOT/shims/python文件中设置了环境变量.bashrc。无济于事。

使用系统Python版本3.8.5可以完美工作:

$ pyenv install django
Creating a virtualenv for this project…
Pipfile: /home/user/projects/test_project/Pipfile
Using /home/user/.pyenv/shims/python (3.8.5) to create virtualenv…
⠹ Creating virtual environment...created virtual environment Cpython3.8.5.final.0-64 in 114ms
  creator Cpython3Posix(dest=/home/user/.local/share/virtualenvs/test_project-eAvoynKo-/home/user/.pyenv/shims/python,app_data_dir=/home/user/.local/share/virtualenv)
    added seed packages: pip==20.2.2,XonshActivator

✔ Successfully created virtual environment! 
Virtualenv location: /home/user/.local/share/virtualenvs/test_project-eAvoynKo-/home/user/.pyenv/shims/python
Creating a Pipfile for this project…
Installing django…
Adding django to Pipfile's [packages]…
✔ Installation Succeeded 
Pipfile.lock not found,creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Building requirements...
Resolving dependencies...
✔ Success! 
Updated Pipfile.lock (a6086c)!
Installing dependencies from Pipfile.lock (a6086c)…
  ?   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
To activate this project's virtualenv,run pipenv shell.
Alternatively,run a command inside the virtualenv with pipenv run.

更新

尽管我仍然无法通过删除pyenv shell x.x.x环境变量并使用pipenv_PYTHON创建一个新的virtualenv来识别由pipenv install --python 3.6激活的python版本,但pipenv确实可以识别pyenv版本已安装。

解决方法

pipenv不尊重pyenv localpyenv globalreference

也许它也不尊重pyenv shell

我通常会做您所做的事,像pipenv install --python 3.7这样指定python

,

您可以尝试使Pipenv遵循Pyenv Python版本:

在您的shell配置文件(这是/.zshrc)中将Pipenv定向到Pyenv垫片

export PIPENV_PYTHON="$PYENV_ROOT/shims/python"

注意:

  1. 确保在外壳程序配置文件中正确设置了PYENV_ROOT

  2. 如果使用其他版本的python创建pipfile和pipfile.lock,则可能必须重新制作它们。

答案来自Pipenv docsthis Stackoverflow answer和bani(此问题的另一个答案)。