在蛇形规则中使用pyenv

时间:2017-06-01 19:55:42

标签: shell pyenv snakemake

我正在使用snakemake进行冗长而复杂的管道,其中包含一些外部编写的python2脚本。当我尝试使用pyenv指定python2时,pyenv shell命令失败而pyenv globalpyenv local无效。我有两个问题。

  • 为什么shell命令不存在?是因为snakemake运行非登录的非交互式shell吗?
  • 是否可以使用pyenv?
  • 在snakemake规则中切换到python2

这是一个示例Snakefile。

rule aaa:
   output:
      "aaa.txt"
   shell:
      """
      pyenv versions
      python --version
      echo "global"
      pyenv global 2.7.12
      python --version
      echo "local"
      pyenv local 2.7.12
      python --version
      echo "shell"
      pyenv shell 2.7.12
      python --version
      echo "pa-pa, zlyj svite" > aaa.txt
      """

产生以下输出。

...
rule aaa:
    output: aaa.txt
    jobid: 0

  system
  2.7.12
  3.5.2
* 3.6.1 (set by PYENV_VERSION environment variable)
Python 3.6.1
global
Python 3.6.1
local
Python 3.6.1
shell
pyenv: no such command `shell'
Error in job aaa while creating output file aaa.txt.
...

1 个答案:

答案 0 :(得分:0)

如果其他人需要此功能,我会得到部分答案。据我所知,当snakemake生成一个shell来运行命令时,shell不会读取$HOME/.bashrc$HOME/.bash_profile$HOME/.profile。我通过向其中一个文件添加环境变量然后尝试使用现有shell(即没有该变量集的shell)在Snakefile中读取其值来测试它。但是,生成的shell继承了当前shell的环境。这相当于在不运行$PYENV_ROOT/bin的情况下向$PATH添加pyenv init。因此,pyenv命令可供shell查找,但它不能完全运行。

因此,要在Snakefile中使用pyenv,您只需要在每个要使用它的规则的开头添加eval "$(pyenv init -)"。例如,以下Snakefile按预期工作。

rule aaa:
   output:
      "aaa.txt"
   shell:
      """
      eval "$(pyenv init -)"
      pyenv versions
      python --version
      echo "shell"
      pyenv shell 2.7.12
      python --version
      echo "pa-pa, zlyj svite" > aaa.txt
      """

产生以下输出

...
  system
  2.7.12
  3.5.2
* 3.6.1 (set by PYENV_VERSION environment variable)
Python 3.6.1
shell
Python 2.7.12
...

我仍然不明白为什么没有读取rc和profile文件。