使用脚本参数在Snakemake中指定Python版本

使用脚本参数在Snakemake中指定Python版本,python,snakemake,Python,Snakemake,我有一些代码,我正在合并到Snakemake管道中。我还希望能够独立于Snakemake运行代码,因此我希望编写灵活的代码。我有一个可以被Snakemake读取的配置文件,还有一个替代配置文件,如果代码在Snakemake之外运行,它将被解析 我的Snakemake文件中的规则具有以下结构: rule some_rule: input: input_file output: output_file script: runfi

我有一些代码,我正在合并到Snakemake管道中。我还希望能够独立于Snakemake运行代码,因此我希望编写灵活的代码。我有一个可以被Snakemake读取的配置文件,还有一个替代配置文件,如果代码在Snakemake之外运行,它将被解析

我的Snakemake文件中的规则具有以下结构:

rule some_rule:
    input:
        input_file
    output:
        output_file
    script:
        runfile.py
然后在
runfile.py
中,我测试脚本是否在Snakemake中运行,如下所示:

if 'snakemake' in globals():
    # Get config params from Snakemake
else:
    # Load config params from alternative config file 
rule some_rule:
    input:
        input_file
    output:
        output_file
    shell:
        /path/to/python runfile.py
这很好,只是我在虚拟环境中工作,我想要使用的Python版本与Snakemake默认使用的版本不同。 因此,我不得不对规则进行如下重组:

if 'snakemake' in globals():
    # Get config params from Snakemake
else:
    # Load config params from alternative config file 
rule some_rule:
    input:
        input_file
    output:
        output_file
    shell:
        /path/to/python runfile.py
但是现在因为我使用的是
shell
而不是
script
,所以我无法访问python文件中的
global
参数'snakemake'

所以我的问题是

(i) 我是否可以指定一个Python版本并仍然使用
脚本


(ii)我是否可以使用
shell
,但仍然可以访问脚本中的“snakemake”对象,这将允许我测试脚本是否正在snakemake管道中运行?

您可以使用Conda-它将提供对执行上下文的细粒度控制,并提高管道的可再现性。看

首先,您需要一个环境定义YAML文件。比如说,

envs/py37.yml

channels:
  - defaults
dependencies:
  - python=3.7
snakemake --use-conda output_file
在该文件中添加您需要的任何其他需求。那么你的规则就是

蛇形文件

rule some_rule:
    input:
        input_file
    output:
        output_file
    conda:
        envs/py37.yml
    script:
        runfile.py
最后,您现在需要在启动此作业时使用附加标志
--使用conda
,例如

壳牌公司

channels:
  - defaults
dependencies:
  - python=3.7
snakemake --use-conda output_file

假设我对您的任务了解得不够详细,那么让
runfile.py
独立于配置文件的来源不是更好吗?添加以文件作为输入的命令行选项,或为各个参数添加命令行选项。我认为这样可以使
runfile.py
更加独立、可移植和易于测试。