Conda:列出所有使用某个包的环境
Conda: list all environments that use a certain package
如何获取在 conda 中使用某个包的所有环境的列表?
康达搜索
从 Conda v 4.5.0 开始,conda search
命令有一个 --envs
标志用于在本地环境中搜索已安装的软件包。见 conda search -h
:
--envs Search all of the current user's environments. If run
as Administrator (on Windows) or UID 0 (on unix),
search all known environments on the system.
the original Issue 中给出的一个用例是寻找具有过时版本 openssl
包的环境:
conda search --envs 'openssl<1.1.1l'
康达PythonAPI
这是一个如何使用 Conda Python 包(运行 在 base 环境中执行此操作的示例):
import conda.gateways.logging
from conda.core.envs_manager import list_all_known_prefixes
from conda.cli.main_list import list_packages
from conda.common.compat import text_type
# package to search for; this can be a regex
PKG_REGEX = "pymc3"
for prefix in list_all_known_prefixes():
exitcode, output = list_packages(prefix, PKG_REGEX)
# only print envs with results
if exitcode == 0 and len(output) > 3:
print('\n'.join(map(text_type, output)))
这从 Conda v4.10.0 开始有效,但由于它依赖于内部方法,因此不能保证继续进行。也许这应该是一个功能请求,例如 conda list --any
.
这样的 CLI 命令
脚本版本
这是一个使用包名参数的版本:
conda-list-any.py
#!/usr/bin/env conda run -n base --no-capture-output python
## Usage: conda-list-any.py [PACKAGE ...]
## Example: conda-list-any.py numpy pandas
import conda.gateways.logging
from conda.core.envs_manager import list_all_known_prefixes
from conda.cli.main_list import list_packages
from conda.common.compat import text_type
import sys
for pkg in sys.argv[1:]:
print("#"*80)
print("# Checking for package '%s'..." % pkg)
n = 0
for prefix in list_all_known_prefixes():
exitcode, output = list_packages(prefix, pkg)
if exitcode == 0 and len(output) > 3:
n += 1
print("\n" + "\n".join(map(text_type, output)))
print("\n# Found %d environment%s with '%s'." % (n, "" if n == 1 else "s", pkg))
print("#"*80 + "\n")
顶部的 shebang 应该确保它将 运行 在 base 中,至少在 Unix/Linux 系统上。
我 运行 遇到了同样的问题并构建了一个 Powershell 脚本:
- 将正则表达式查询作为参数
- 遍历所有可用的 conda 环境(并在这样做时显示进度条)
- 列出每个环境中的所有包
- returns 具有与查询匹配的包的环境
- 每个返回的环境显示与查询匹配的包名称
脚本位于此答案的底部。我已将其保存在名称为 search-pkg-env.ps1
.
的 PATH 中可用的文件夹中
脚本可以运行如下(这里我搜索的环境有pip
包pymupdf
):
PS > search-pkg-env.ps1 pymupdf
Searching 19 conda environments...
py39
- pymupdf 1.18.13
脚本
if ($args.Length -eq 0) {
Write-Host "Please specify a search term for that matches the package name (regex)." -BackgroundColor DarkYellow -ForegroundColor White
exit
}
$pkg_regex = $args[0]
$conda_envs = ConvertFrom-JSON -InputObject $([string]$(conda env list --json))
$total = $conda_envs.envs.Count
Write-Host "Searching $total conda environments..."
$counter = 1
ForEach ($conda_env in $conda_envs.envs) {
if ($total -gt 0) {
$progress = $counter / $total * 100
}
else {
$progress = 0
}
# Split the full path into its elements
$parts = $conda_env -Split '\'
# The last element has the env name
$env_name = $parts[-1]
Write-Progress -Activity "Searching conda environment $env_name for $pkg_regex" -PercentComplete $progress
# Now search the provided package name in this environment
$search_results = ConvertFrom-JSON -InputObject $([string]$(conda list $pkg_regex -n $env_name --json))
If ($search_results.Count -gt 0) {
Write-Host $env_name
foreach ($result in $search_results) {
$pkg_name = $result.name
$pkg_version = $result.version
Write-Host " - $pkg_name $pkg_version"
}
}
$counter++
}
如何获取在 conda 中使用某个包的所有环境的列表?
康达搜索
从 Conda v 4.5.0 开始,conda search
命令有一个 --envs
标志用于在本地环境中搜索已安装的软件包。见 conda search -h
:
--envs Search all of the current user's environments. If run
as Administrator (on Windows) or UID 0 (on unix),
search all known environments on the system.
the original Issue 中给出的一个用例是寻找具有过时版本 openssl
包的环境:
conda search --envs 'openssl<1.1.1l'
康达PythonAPI
这是一个如何使用 Conda Python 包(运行 在 base 环境中执行此操作的示例):
import conda.gateways.logging
from conda.core.envs_manager import list_all_known_prefixes
from conda.cli.main_list import list_packages
from conda.common.compat import text_type
# package to search for; this can be a regex
PKG_REGEX = "pymc3"
for prefix in list_all_known_prefixes():
exitcode, output = list_packages(prefix, PKG_REGEX)
# only print envs with results
if exitcode == 0 and len(output) > 3:
print('\n'.join(map(text_type, output)))
这从 Conda v4.10.0 开始有效,但由于它依赖于内部方法,因此不能保证继续进行。也许这应该是一个功能请求,例如 conda list --any
.
脚本版本
这是一个使用包名参数的版本:
conda-list-any.py
#!/usr/bin/env conda run -n base --no-capture-output python
## Usage: conda-list-any.py [PACKAGE ...]
## Example: conda-list-any.py numpy pandas
import conda.gateways.logging
from conda.core.envs_manager import list_all_known_prefixes
from conda.cli.main_list import list_packages
from conda.common.compat import text_type
import sys
for pkg in sys.argv[1:]:
print("#"*80)
print("# Checking for package '%s'..." % pkg)
n = 0
for prefix in list_all_known_prefixes():
exitcode, output = list_packages(prefix, pkg)
if exitcode == 0 and len(output) > 3:
n += 1
print("\n" + "\n".join(map(text_type, output)))
print("\n# Found %d environment%s with '%s'." % (n, "" if n == 1 else "s", pkg))
print("#"*80 + "\n")
顶部的 shebang 应该确保它将 运行 在 base 中,至少在 Unix/Linux 系统上。
我 运行 遇到了同样的问题并构建了一个 Powershell 脚本:
- 将正则表达式查询作为参数
- 遍历所有可用的 conda 环境(并在这样做时显示进度条)
- 列出每个环境中的所有包
- returns 具有与查询匹配的包的环境
- 每个返回的环境显示与查询匹配的包名称
脚本位于此答案的底部。我已将其保存在名称为 search-pkg-env.ps1
.
脚本可以运行如下(这里我搜索的环境有pip
包pymupdf
):
PS > search-pkg-env.ps1 pymupdf
Searching 19 conda environments...
py39
- pymupdf 1.18.13
脚本
if ($args.Length -eq 0) {
Write-Host "Please specify a search term for that matches the package name (regex)." -BackgroundColor DarkYellow -ForegroundColor White
exit
}
$pkg_regex = $args[0]
$conda_envs = ConvertFrom-JSON -InputObject $([string]$(conda env list --json))
$total = $conda_envs.envs.Count
Write-Host "Searching $total conda environments..."
$counter = 1
ForEach ($conda_env in $conda_envs.envs) {
if ($total -gt 0) {
$progress = $counter / $total * 100
}
else {
$progress = 0
}
# Split the full path into its elements
$parts = $conda_env -Split '\'
# The last element has the env name
$env_name = $parts[-1]
Write-Progress -Activity "Searching conda environment $env_name for $pkg_regex" -PercentComplete $progress
# Now search the provided package name in this environment
$search_results = ConvertFrom-JSON -InputObject $([string]$(conda list $pkg_regex -n $env_name --json))
If ($search_results.Count -gt 0) {
Write-Host $env_name
foreach ($result in $search_results) {
$pkg_name = $result.name
$pkg_version = $result.version
Write-Host " - $pkg_name $pkg_version"
}
}
$counter++
}