4

我将蛇形制作用于涉及一些外部编写的 python2 脚本的长而复杂的管道。当我尝试使用 pyenv 指定 python2 时,pyenv shell命令失败pyenv global并且pyenv 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.
...
4

1 回答 1

0

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

因此,要pyenv在 Snakefile 中使用,您只需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 文件。

于 2017-07-26T05:32:13.223 回答