原题:
据我所知,snakemake conda envs的最佳实践(例如,参见这个答案和Johannes Köster的评论),每个规则都应该有自己的env yaml文件,以保持模块化和可维护。在我的例子中是25个环境。通常,我认为这些应该只指定每个规则所需的最低限度的工具。
然而,这对于某些规则来说是失败的,其中安装在规则环境中的工具会拉出pandas
或numpy
的版本,而这些版本与"父"中的版本不相同。蛇行运行的环境
例如,pandas
不匹配导致
AttributeError: Can't get attribute '_unpickle_block' on <module 'pandas._libs.internals'
对于numpy
,我得到
ImportError: Unable to import required dependencies:
numpy:
通过指定pandas
和numpy
的相同版本作为父环境,这两个问题都很容易解决。例如,运行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)。