如何列出使用 venv 创建的所有虚拟环境?

13

有人刚刚问我如何列出使用venv创建的所有虚拟环境。

我只能想到搜索pyvenv.cfg文件以找到它们。类似于:

from pathlib import Path

venv_list = [str(p.parent) for p in Path.home().rglob('pyvenv.cfg')]

这可能会包括一些误报。是否有更好的方法来列出所有使用 venv 创建的虚拟环境?

NB:这个问题是关于venv特别是,而不是Anaconda、virtualenv等。


请尝试执行以下命令 -> lsvirtualenv - Eddwin Paz
1
@EddwinPaz 我特别询问有关 venv 模块的内容。 - Jacques Gaudin
在使用操作系统上执行grep命令,我阅读了一些venv的用法并创建了一个文件夹。另一个想法是查看所有正在运行的进程,但我不知道如何可能接近解决方案。正在研究中。 - Eddwin Paz
你是否找到了一种搜索/列出 venvs 的万无一失的方法? - Niko Pasanen
@np8 不是很确定。我最好的猜测是查找pyvenv.cfg并通过测试每个候选项的功能来消除潜在的误报,例如activate命令的成功? - Jacques Gaudin
显示剩余3条评论
2个回答

9

在Linux/macOS上,以下命令可以找到大部分信息:

find ~ -d -name "site-packages" 2>/dev/null

该命令会寻找家目录下名为“site-packages”的文件夹,其中包含了venv安装的pip软件。/dev/null这一部分用于减少你无权查看的文件夹内容。

此外,你也可以通过查找某个特定文件来获取更具体的信息。例如,如果想要查找activate文件中是否包含了nondestructive字符串,那么就需要使用以下命令来匹配venv而不是anaconda等其他相似内容。

find ~ -type f -name "activate" -exec egrep -l nondestructive /dev/null {} \; 2>/dev/null

macos mdfind

在macos上,使用mdfind会更快一些(Linux上则可能使用locate命令达到类似效果)。

mdfind -name activate | egrep /bin/activate$|  xargs -o egrep -l nondestructive 2>/dev/null | xargs -L 1 dirname | xargs -L 1 dirname

所以我们:

  • 查找所有激活文件
  • 使用egrep匹配只有bin/activate文件(mdfind会匹配类似于.../bin/ec2-activate-license
  • 查找那些有与nondestructive匹配的文件名并打印出来。
  • 2个xargs -L 1 dirname 命令使我们可以从 /bin/activate 向虚拟环境的根目录“爬升”。

带有-v标志的辅助函数以显示详细信息。

jvenvfindall(){  # search for Python virtual envs.  -v for verbose details


    unset verbose
    
    OPTIND=1
    while getopts 'v' OPTION; do
      case "$OPTION" in
    
        v)
          verbose=1
          ;;
    
        ?)
          ;;
      esac
    done
    shift "$(($OPTIND -1))"
    
    
    local bup=$PWD
    for dn in $(mdfind -name activate | egrep /bin/activate$|  xargs -o egrep -l nondestructive 2>/dev/null | xargs -L 1 dirname | xargs -L 1 dirname) 
    do

        if [[ -z "$verbose" ]]; then
            printf "$dn\n"
        else
            printf "\n\nvenv info for $dn:\n"
            cd $dn
            echo space usage, $(du -d 0 -h)
            #requires the jq and jc utilities... to extract create and modification times
            echo create, mod dttm: $(stat . | jc --stat | jq '.[]|{birth_time, change_time}')
            tree -d -L 1 lib


        fi
    done

    cd $bup
}


输出:

...

venv info for /Users/me/kds2/issues2/067.pip-stripper/010.fixed.p1.check_venv/venvtest:
space usage, 12M .
create, mod dttm: { "birth_time": "Apr 16 13:04:43 2019", "change_time": "Sep 30 00:00:39 2019" }
lib
└── python3.6

...


嗯,磁盘使用情况并不算太糟,但对于node_modules来说类似的处理可能会节省一些真实的空间。

另一个选项是使用命令 find ~ -type l -name python 查找所有指向 Python 二进制文件的符号链接。 - frost-nzcr4
1
@frost-nzcr4 那也可以。有趣的是,如果你复制一个虚拟环境的文件,比如 cp -r venv1/ venv2,然后 source venv2/bin/activate 激活虚拟环境,那么它会指向 venv1 的 Python。所以,它很接近,但不像复制一个带有 .git 的目录那样自包含。这是因为路径在安装时被硬编码了。 - JL Peyret
关于复制 venv 文件夹的问题很有趣。我想不到除了查找文件之外的其他方法。查找 python,你会得到所有形式的 Python 解释器,查找 pyvenv.cfg,你只会得到使用 venv 创建的虚拟环境。也许? - Jacques Gaudin
1
@JacquesGaudin pyenv.cfg可能是一个不错的选择。只需通过操作系统和文件系统进行,而不是在Python脚本内部。即使您需要编程访问,您也可以轻松地使用子进程find - 例如,我曾经在巨大文件上启动了简单的grep而不是逐行使用Python。这不是我通常会做的事情,但我确实在努力优化,让操作系统和其实用程序完成工作最终变得更快。 - JL Peyret
1
@JacquesGaudin。你看过sd吗?它是基于Rust的替代sed工具,用于修改文件(而不是bash字符串)。有一些缺陷,但相当不错。https://github.com/chmln/sd - JL Peyret
显示剩余2条评论

4
标准库venv不会跟踪已创建的虚拟环境,因此列出所有环境的唯一可能性是搜索硬盘以查找符合某些标准的文件夹。 PEP 405很好地列出了应包含在文件夹中的内容,以使其成为虚拟环境。此外,这篇博客文章很好地解释了虚拟环境的一部分内部机制。虚拟环境的定义如下:

在其最简单的形式中, Python虚拟环境仅由 Python二进制文件的副本或符号链接、pyvenv.cfg 文件和site-packages 目录组成。(PEP 405)

总之,您将需要搜索以下文件夹以查找虚拟环境:

Linux / macOS

  • 带有 home 关键字的 pyvenv.cfg
  • 带有 bin/python3 或者 bin/python
  • 带有 lib/<python-version>/site-packages/,其中 <python-version> 例如为 python3.3.
  • 可选项:如果使用venv创建,则还具有bin/activate (源代码)。即使缺少此文件夹,也将认为该文件夹是虚拟环境。(PEP 405

Windows

  • 带有home键的pyvenv.cfg*
  • 具有Script/python.exe
  • 具有lib/<python-version>/site-packages/,其中<python-version>例如为python3.3
  • 可选:如果使用venv创建,则还具有Scripts/activate.batScripts/Activate.ps1 (来源)。即使缺少这些文件夹,该文件夹也被视为虚拟环境。(PEP 405)

*pyvenv.cfg

pyvenv.cfg实际上可以在与python可执行文件相同的文件夹中或其上一级子文件夹中。 属于虚拟环境的pyvenv.cfg必须具有home = <home>行,其中<home>是包含用于创建虚拟环境的Python可执行文件的目录。(PEP 405)。


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