有人刚刚问我如何列出使用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等。
有人刚刚问我如何列出使用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等。
在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
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
所以我们:
mdfind
会匹配类似于.../bin/ec2-activate-license
)nondestructive
匹配的文件名并打印出来。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
...
find ~ -type l -name python
查找所有指向 Python 二进制文件的符号链接。 - frost-nzcr4cp -r venv1/ venv2
,然后 source venv2/bin/activate
激活虚拟环境,那么它会指向 venv1 的 Python。所以,它很接近,但不像复制一个带有 .git
的目录那样自包含。这是因为路径在安装时被硬编码了。 - JL Peyretpython
,你会得到所有形式的 Python 解释器,查找 pyvenv.cfg
,你只会得到使用 venv
创建的虚拟环境。也许? - Jacques Gaudinfind
- 例如,我曾经在巨大文件上启动了简单的grep
而不是逐行使用Python。这不是我通常会做的事情,但我确实在努力优化,让操作系统和其实用程序完成工作最终变得更快。 - JL Peyretsd
吗?它是基于Rust的替代sed工具,用于修改文件(而不是bash字符串)。有一些缺陷,但相当不错。https://github.com/chmln/sd - JL Peyretvenv
不会跟踪已创建的虚拟环境,因此列出所有环境的唯一可能性是搜索硬盘以查找符合某些标准的文件夹。
PEP 405很好地列出了应包含在文件夹中的内容,以使其成为虚拟环境。此外,这篇博客文章很好地解释了虚拟环境的一部分内部机制。虚拟环境的定义如下:
总之,您将需要搜索以下文件夹以查找虚拟环境:在其最简单的形式中, Python虚拟环境仅由 Python二进制文件的副本或符号链接、pyvenv.cfg 文件和site-packages 目录组成。(PEP 405)
home
关键字的 pyvenv.cfg
bin/python3
或者 bin/python
lib/<python-version>/site-packages/
,其中 <python-version>
例如为 python3.3
.venv
创建,则还具有bin/activate
(源代码)。即使缺少此文件夹,也将认为该文件夹是虚拟环境。(PEP 405)home
键的pyvenv.cfg*
Script/python.exe
lib/<python-version>/site-packages/
,其中<python-version>
例如为python3.3
。venv
创建,则还具有Scripts/activate.bat
和Scripts/Activate.ps1
(来源)。即使缺少这些文件夹,该文件夹也被视为虚拟环境。(PEP 405)pyvenv.cfg
pyvenv.cfg
实际上可以在与python
可执行文件相同的文件夹中或其上一级子文件夹中。 属于虚拟环境的pyvenv.cfg
必须具有home = <home>
行,其中<home>
是包含用于创建虚拟环境的Python可执行文件的目录。(PEP 405)。
venv
模块的内容。 - Jacques Gaudin