我正在使用 Snakemake 来实现一个漫长而复杂的管道,其中涉及一些外部编写的 python2 脚本。当我尝试使用 pyenv 指定 python2 时,pyenv shell
命令失败,同时pyenv global
and 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.
...
如果其他人需要此功能,我有部分答案。据我所知,当snakemake生成一个shell来运行命令时,shell不会读取$HOME/.bashrc
, $HOME/.bash_profile
, or $HOME/.profile
。我通过向其中一个文件添加一个环境变量,然后尝试在一个文件中读取它的值来测试它Snakefile
使用现有的 shell(即没有设置该变量的 shell)。但是,生成的 shell 会继承当前 shell 的环境。这相当于添加$PYENV_ROOT/bin
给你的$PATH
不跑步pyenv init
。作为结果,pyenv
shell 可以找到命令,但它不能完全运行。
所以,要使用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 和配置文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)