我正在使用snakemake进行冗长而复杂的管道,其中包含一些外部编写的python2脚本。当我尝试使用pyenv指定python2时,pyenv shell
命令失败而pyenv global
和pyenv local
无效。我有两个问题。
shell
命令不存在?是因为snakemake运行非登录的非交互式shell吗?这是一个示例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.
...
答案 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文件。