在Snakemake (python3)中,我运行了一些用python2写的软件,Snakemake用python3运行软件,忽略了调用python2的文件上的shebang。 这是别人的软件,所以我不想费力地重写它来运行python3。
如何强制 snakemake 运行外部脚本 shebang 中的 python 版本,而不是当前环境中的 python 版本?
我知道 snakemake 允许用户通过以下方式强制运行特定的环境。--use-conda
,并调用python2环境。但是,我不想这样做,因为这样做出来的脚本的可移植性会降低。
我试过在外部python脚本前加上... #!/usr/bin/env python2
或 #!/usr/bin/python2
每次都是因为Snakemake用python3而不是python2来运行它们,所以脚本失败了。 当我在shell中调用脚本时,在Snakemake之外的其他程序用python2运行。
这是snakefile:
#snakefile
rule all:
input:
my_output.txt
rule foo:
output:
txt = my_output.txt
shell:
"""
external_program.py > {output.txt}
"""
这是 external_program.py
:
#!/usr/bin/env python2
print "this will work in python2, but not python3"
我真的觉得你应该用conda环境来解决这个问题。我觉得你现在的做法是 "不那么可移植 "的。所以我决定在这个问题中给出两个答案,一个有conda> 一个没有conda> 希望能说服你使用conda方法:)。
如果你的电脑上安装了python 2,那么你可以用以下两种方法来调用它。python2
或 /usr/bin/python2
rule foo:
output:
txt = my_output.txt
shell:
"""
python2 external_program.py > {output.txt}
"""
用conda解决这个问题需要我们制作一个环境.yaml文件。
dependencies:
- python=2.7
现在我们必须像这样引用这个环境:
rule foo:
output:
txt = my_output.txt
conda: "environment.yaml"
shell:
"""
python2 external_program.py > {output.txt}
"""
并使用 --use-conda
旗帜与蛇精制造。