python、pandas和numpy的版本不匹配



原题:

据我所知,snakemake conda envs的最佳实践(例如,参见这个答案和Johannes Köster的评论),每个规则都应该有自己的env yaml文件,以保持模块化和可维护。在我的例子中是25个环境。通常,我认为这些应该只指定每个规则所需的最低限度的工具。

然而,这对于某些规则来说是失败的,其中安装在规则环境中的工具会拉出pandasnumpy的版本,而这些版本与"父"中的版本不相同。蛇行运行的环境

例如,pandas不匹配导致

AttributeError: Can't get attribute '_unpickle_block' on <module 'pandas._libs.internals'

对于numpy,我得到

ImportError: Unable to import required dependencies:
numpy: 

通过指定pandasnumpy的相同版本作为父环境,这两个问题都很容易解决。例如,运行snakemaker的conda环境具有以下依赖项:

- python ==3.7.10
- pandas ==1.3.1
- numpy ==1.21.0

然后,将这三行添加到我所有的单独规则中。Yaml文件解决了上述问题。

然而,这对我来说似乎不是一个好的甚至是正确的解决方案。这样,任何更新这些依赖项的版本都需要我在所有rule yaml文件中更改它。

据我所知,这源于conda默认在激活另一个环境之前停用一个环境,而不是堆叠/嵌套它们(见这里)。

:

  • 一种通过在主环境中堆叠/嵌套它们来激活规则环境的方法,从主环境中运行snake makake(我不想设置conda的全局auto_stack,因为这可能会干扰其他东西)?
  • 或者有一种方法可以引用或"包含"一个通用的yaml文件到每个规则文件中,这样三个依赖项就不必在每个规则文件中列出了?
  • 我没有看到的另一个解决方案?

编辑:看来,至少在《造蛇》中,numpy错误是一个令人难以置信的复杂错误。我已经把这个作为issue提交给了snakemake。然而,如何避免环境规范的重复仍然是一个普遍的问题。

更新:

自从最初提出这个问题以来,我已经对它进行了更多的尝试,见这里,其中还包含一个最小的示例来测试它。

问题归结为:

  • 当调用具有conda环境规范的规则时,Snakemake堆栈(巢)环境。我最初的猜测是错误的。
  • 当这个环境的python/numpy/pandas版本与运行snakemaker的父环境冲突时,我们很容易得到错误(如上所示)。
  • 例如,当在该环境中请求的工具(隐式)依赖于python/pandas时,conda会拉入冲突的版本。
  • 为了防止这种情况,我们当然可以在环境中显式地请求无冲突的python版本,但这似乎很浪费,而且很难维护。

是否有更好的解决方案?

据我所知,snakemake conda环境的最佳实践是,每个规则都应该有自己的环境文件,以保持模块化和可维护性。

你有参考资料吗?就像你说的,这意味着创造很多环境。此外,在每条规则执行之前运行conda activate将会增加相当多的运行时间。

我通常为整个项目创建一个conda环境,为整个snakemake管道,并在不兼容的情况下创建特定于规则的环境(例如规则需要python2)。

最新更新