Pyenv选择虚拟环境目录

27

我刚开始使用 pyenv 管理我的 Python 版本,并开始使用 pyenv virtualenv 插件管理我的虚拟环境,到目前为止,我非常喜欢它。不过,我遗憾的是,在使用 virtualenv 的时候,你可以将虚拟环境放置在代码库目录中,以使得代码库成为一个完全可重现的环境。 有没有人知道如何在 pyenv 中选择虚拟环境所在的目录?

10个回答

20

简短回答: 据我所知,你不能这样做。

而且实际上也不会起作用,对吧?如果你使用 pyenv virtualenv 命令在一个repo中安装virtualenv,并将该repo克隆到另一台机器上... 新机器上的 pyenv 如何知道要控制存储在存储库中的virtualenv呢?

此外,“你可能不应该这样做”。Virtualenv并不是与底层Python安装完全隔离的,而且并不是非常便携。而且你真的想在你的repo中散布大量易于复制的垃圾代码吗?正确的方法可能是维护一个requirements.txt文件,以供pip使用--这样你就可以在任何克隆你的repo的地方轻松地复现你的开发环境。

话虽如此,你完全可以使用普通的virtualenv 在任何地方创建virtualenv,即使你已经在pyenv控制下的Python解释器中安装了virtualenv。该virtualenv本身当然不会由pyenv管理,但你仍然可以像以前一样使用它...


1
作为一个看到这个问题的人,我有一个 requirements.txt 文件和一个生成虚拟环境的脚本。我想要一个命令,在当前路径中查找虚拟环境,并且不想管理“全局”虚拟环境。我希望我的虚拟环境存在于一个目录中。 - Att Righ
你可以这样做,而且非常容易,一点也不麻烦 - 我已经在下面添加了我的常规工作流程(链接:https://dev59.com/4F0a5IYBdhLWcg3wYXq8#74019181)。 - Jakob Guldberg Aaes

6

3

有一个解决方法

在您的项目目录中,创建一个.python-version文件。假设您已经使用pyenv-virtualenv安装了一些虚拟环境,然后将以下行追加到该文件中(您可能需要更改版本号):

3.7.1/envs/your-project-name@3.7.1

无论您何时进入该目录,都会使用正确的Python版本,并且它运行得非常好。

5
或者,使用pyenv local <虚拟环境名称>命令,pyenv将在当前路径下为您创建该文件。 - Terrabits
这个文件可能有一个全球位置吗? - KamilCuk

3
我使用以下命令:
pyenv local 3.9.16

然后

python -m venv virtualenv

它运行正常


2
怎么样:
pyenv install -s 3.8.3 # install preferred version if needed
PYENV_VERSION=3.8.3 python -m venv /tmp/your/prefered/dir ; source /tmp/your/prefered/dir/activate

请注意,此方法使用的是 venv 而不是 virtualenv,两者略有不同,但都是标准库的一部分。

1

我使用以下简单的步骤:

  1. python -m venv virt 创建本地虚拟环境
  2. 使用 ln -s <local virt> ~/.pyenv/versions/<venv name> 将虚拟环境链接到 pyenv
  3. 现在你可以使用 pyenv local <venv name> 命令,并且所有其他 pyenv 的操作都将在此虚拟环境中进行。

对于有兴趣的人,我已经制作了两个CLI

  • pyenv-here 一次性创建新的虚拟环境并设置本地目录
  • pyenv-link 将本地虚拟环境链接到pyenv

这应该是被接受的答案。 - Natacha

1

顶部的评论是错误的;你当然可以。

一旦你使用pyenv virtualenv 3.9.15 your-environment-name创建了你的虚拟环境,你可以使用以下命令自动指定该环境将自动使用的目录。在你想要的目录中运行:

pyenv local your-environment-name

该命令将创建必要的.python-version文件,其中包括您环境的名称。从现在开始,每次进入该文件夹时,指定的环境将被使用。

问题是指venv目录将被放置在哪里,而不是在您进入时会激活什么。 - Natacha

0
略微偏离主题的答案,但我最终编写了一个类似于pyenv的hacky等效工具,它会在目录及其父目录中查找virtualenv,因为pyenv似乎并不真正支持这一点,如答案中所述
我将此脚本命名为enpy,将其放在我的路径上,然后调用例如enpy -c import sys; print(sys.executable)
#!/usr/bin/python3

import os
import sys

from pathlib import Path


NAMES = ("venv", "env", ".env", ".venv")


def find_python():
    cwd = Path(os.getcwd())
    for direc in [cwd] + list(cwd.parents):
        for p in NAMES:
            venv = direc / p
            if venv.exists():
                return venv / "bin" / "python"
    else:
        raise Exception("Could not find python")


python = find_python()
os.execvp(str(python), [str(python)] + sys.argv[1:])


0
如果您想仅使用pyenv特定的Python版本并在所需目录中创建虚拟环境,您可以执行以下操作:
~/.pyenv/versions/3.10.8/bin/python -m venv my/path/to/venv

-1

在之前的评论基础上,你可以将以下内容添加到你的 .zshrc 文件中:

pyC () {
    location="requirements.txt"
    venvName=".venv"
    
    # Parse flags
    while getopts "r:e:" opt; do
        case $opt in
            e) venvName=$OPTARG ;;
            r) location=$OPTARG ;;
            \?) echo "Invalid option: -$OPTARG" ;;
            :) echo "Option -$OPTARG requires an argument.";;
        esac
    done

    # Remove existing virtual environment if it exists
    [ -d $venvName ] && rm -rf $venvName
    
    # Determine Python version (global or local)
    pyVersion=$( [ -f .python-version ] && echo "local" || echo "global" )

    # Check pyVersion, create version file, virtual environment, activate it
    pyenv version-name $pyVersion | xargs -I {} pyenv local {} && python -m venv $venvName
    source $venvName/bin/activate && pip install --upgrade pip
    
    # Install requirements if file exists, otherwise print message
    [ -f $location ] && pip install -r $location || echo -e "\nFile $location not found"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接