【问题标题】:How to use the conda MatchSpec?如何使用 conda MatchSpec?
【发布时间】:2019-12-23 13:55:55
【问题描述】:

How to list package versions available with conda 有有用的答案,其中之一是https://stackoverflow.com/a/47795843/257924,它使用两个等号。 conda search -h 没有完全说明 MatchSpec 语法允许什么,只给出了一些例子。

例如,我想查看最新版本的python下存在哪些包,对于一个名为jedi的包。由于上述缺少 MatchSpec 语法的详细文档,我不得不通过实验和猜测来找到正确的语法。我最终得到:

$ condaw search 'jedi[build=py37*]' --json | grep '"build"' 
      "build": "py37_1",
      "build": "py37_0",
      "build": "py37_0",
      "build": "py37_0",
      "build": "py37_0",
$ 

使用上面的--json 选项只是为了找出诸如build 之类的关键字可能是语法的一部分。

那么,MatchSpec 语法在哪里正式且完整地记录在案,这样我就不必猜测了?我现在的结论是-h 输出是唯一的。

【问题讨论】:

  • 刚刚看到这已被关闭为题外话。为什么不能将它移到 stackexchange 论坛中,而不是关闭它?
  • 没有办法将任何问题迁移到任何堆栈站点,但除此之外,您的问题似乎是关于文档所在的位置,就我而言,这不是任何堆栈的主题知道。
  • @CaptainMan 文档是软件最重要的方面之一。您能否向我们指出一些 stackoverflow 的宣言,其中说明了为什么这个问题超出了范围?
  • 也许我错了,也许是话题,但我说得不好。更好的说法是“如果你问 MatchSpec 的确切语法是什么而不是问文档在哪里,这更有可能成为话题”,我应该通过建议编辑来帮助这样做,因为杰伊沃克做到了。我很抱歉。 :) (而且,我发誓我并不是说这很厚脸皮,但tour page 说明了什么是主题,什么不是主题。询问文档在哪里似乎是一个灰色区域。)

标签: conda


【解决方案1】:

some (possibly outdated) documentation in the conda-build docs。但是,我仍然认为他们代码中的文档更清晰。可以使用

从激活的 base env 中读取它
python -c "from conda.models.match_spec import MatchSpec; help(MatchSpec)"

the GitHub repo

从技术上讲,代码文档更多是关于将MatchSpec 对象序列化为字符串表示,而不是解析字符串的其他方向,但它涵盖了所有可能性。


MatchSpec 字符串

部分文档描述了类本身,但以下是类的字符串文字表示的相关部分:

规范的字符串表示一般可以表示为

(channel(/subdir):(namespace):)name(version(build))[key1=value1,key2=value2]

其中() 表示可选字段。构建规则 规范的字符串表示是:

  1. name(即“包名”)是必需的,但它的值可以是“*”。它的位置总是在键值括号之外。
  2. 如果version 是一个精确的版本,它会出现在键值括号之外,并在前面加上==。如果version 是一个“模糊”值 (例如1.11.*),它位于键值括号之外,带有 .* 离开并由 = 前置。否则 version 是 包含在键值括号内。
  3. 如果version 是精确版本,而build 是精确值,则build 会超出以= 开头的键值括号。 否则,build 进入键值括号内。 build_stringbuild 的别名。
  4. namespace 职位正在为未来的 conda 功能保留。
  5. 如果包含 channel 并且是精确值,则在 channelname 之间使用 :: 分隔符。 channel 可以是 规范的频道名称或频道网址。在规范字符串中 表示,将始终使用规范的频道名称。
  6. 如果channel 是一个精确值并且subdir 是一个精确值,则subdir 将附加到channel 并带有/ 分隔符。否则, subdir 包含在键值括号中。
  7. 键值括号可以用逗号、空格或逗号+空格分隔。值可以选择用单或双包装 引号,但如果 value 包含逗号、空格或 等号。规范格式使用逗号分隔符和单 引号。
  8. 从字符串构造 :class:MatchSpec 实例时,键值括号内给出的任何键值对都会覆盖任何 括号外给出的匹配参数。

支持的键

除了字符串中明确表示的字段外,还支持以下键:

  • build_number
  • track_features
  • features
  • url
  • md5
  • license
  • license_family
  • fn

注意: fn 代表 filename。

示例

文档继续提供示例,展示如何使用 MatchSpec 类生成这些规范字符串:

>>> str(MatchSpec(name='foo', build='py2*', channel='conda-forge'))
'conda-forge::foo[build=py2*]'

>>> str(MatchSpec('foo 1.0 py27_0'))
'foo==1.0=py27_0'

>>> str(MatchSpec('foo=1.0=py27_0'))
'foo==1.0=py27_0'

>>> str(MatchSpec('conda-forge::foo[version=1.0.*]'))
'conda-forge::foo=1.0'

>>> str(MatchSpec('conda-forge/linux-64::foo>=1.0'))
"conda-forge/linux-64::foo[version='>=1.0']"

>>> str(MatchSpec('*/linux-64::foo>=1.0'))
"foo[subdir=linux-64,version='>=1.0']"

【讨论】:

  • 很棒的答案。很高兴还有一种方法可以从命令行转储帮助!
猜你喜欢
  • 1970-01-01
  • 2014-12-08
  • 2016-08-27
  • 2016-03-12
  • 2020-03-29
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多