Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在规则中使用配置数据的语法_Python_Output_Config_Snakemake - Fatal编程技术网

Python 在规则中使用配置数据的语法

Python 在规则中使用配置数据的语法,python,output,config,snakemake,Python,Output,Config,Snakemake,在snakemake规则中是否有充分描述配置数据使用的地方 在yaml文件的用户指南中有一个示例: samples: A: data/samples/A.fastq B: data/samples/B.fastq 然后,在这样的规则中使用: bam=expand("sorted_reads/{sample}.bam", sample=config["samples"]), 上面的代码似乎将{sample}替换为“data/samples/A.fastq”,而不是“A”(和“B

在snakemake规则中是否有充分描述配置数据使用的地方

在yaml文件的用户指南中有一个示例:

samples:
    A: data/samples/A.fastq
    B: data/samples/B.fastq
然后,在这样的规则中使用:

bam=expand("sorted_reads/{sample}.bam", sample=config["samples"]),
上面的代码似乎将{sample}替换为“data/samples/A.fastq”,而不是“A”(和“B”等),显然是这样

在输出规则中使用配置数据的正确方法是什么,例如帮助形成输出文件名?此表单不起作用:

output: "{config.dataFolder}/{ID}/{ID}.yyy"
如果我在yaml文件中定义了复杂的结构化数据,我正在寻找语法指导——如何在snake规则中使用它?何时使用Python语法,何时使用SnakeMake语法

yaml和JSON配置文件受到严重限制,因为它们不能使用文件前面定义的值来定义新值,对吗?这是设置配置参数时经常要做的事情

使用configfile的优势是什么?为什么不直接使用include:include和python文件来定义参数呢

一个有用的东西将是一个参考手册,详细描述了蛇的细节。当前的网站有点分散,需要一段时间才能找到您以前在其中某个地方看到的东西。

YAML配置 这与YAML文件的嵌套有关,请参见示例

config[“samples”]请求将同时返回“A”和“B”。我是我的脑袋,我想它会返回一个列表,但我对变量类型没有把握

通过使用此处列出的配置文件:

您可以以YAML格式链接以下YAML配置文件

settings/config.yaml:

settings/config.yaml:

使用YAML配置访问的结果调用

蛇形档案:

虚拟示例,只是尝试举例说明不同字符串和配置变量的使用。我在fastq2bam规则中使用通配符。通常,我只使用配置变量来设置规则“all”中的内容,如果可能,这是最佳实践。我不能说shell调用是否真的适用于bwamem,但我想你已经明白我的意思了

可以看到更大版本的蛇形文件

一旦设置好配置文件,要引用其中的任何内容,请使用“config”。根据需要,它可用于深入YAML。在这里,我将下降3个假设水平,如下所示:

hypothetical_var = config["yamlVarLvl1"]["yamlVarLvl2"]["yamlVarLvl3"]
等同于(我对键入不太肯定,我认为它会转换为字符串)

如果YAML是:

yamlVarLvl1:
    yamlVarLvl2:
        yamlVarLvl3:
            '124'
            '125'
            '126'
            '127'
            '128'
            '129'
代码组织 Python和Snakemake代码,在大多数情况下可以在某些地方交错。我建议不要这样做,因为这样会使代码难以维护。由用户决定如何实现这一点。例如,使用run或shell指令可以更改访问变量的方式

YAML和JSON文件是首选的配置变量文件,因为我相信它为编辑和命令行界面提供了一些支持,而不是消除变量。如果它是使用外部导入的python变量实现的,那么它就没有那么干净了。它还帮助我的大脑,知道python文件做事情,YAML文件存储事情

YAML始终是一个外部文件,但是

  • 如果您使用的是单个Snakefile,请将支持的python放在顶部
  • 如果您使用多文件系统,请考虑将支持的Python脚本外部化。<李> 教程 我认为完美的小插曲很难设计。我正在努力教我的小组关于Snakemake的知识,我有超过40页的个人书面文档,我提供了三个1小时以上的演示文稿和PowerPoint幻灯片,我已经阅读了几乎所有的ReadTheDocs.io Snakemake手册,我最近刚刚完成了额外的列表,但我还在学习

    顺便说一下,我觉得这也很不错


    这是否提供了足够的上下文?

    在“输出”规则中应该如何使用配置数据?我发现输出字符串不能包含{config.}值。但是,可以使用Python代码包含它们,如下所示:

    output: config["OutputDir"] + "/myfile.txt"
    
    但是,此方法不起作用(在输出:或输入:):

    但是,它在“shell:”中确实起作用:

    请注意,在shell cmd的[]中,OutputDir周围没有引号。在字符串中展开值的{}方法不在键周围使用引号

    配置数据可以按snakefile或python定义吗?对!

    参数可以在使用“configfile”包含的.yaml文件中定义,也可以通过使用“include”包含的常规Python文件定义。后者比IMHO优越,因为.yaml文件不允许定义引用以前的定义,这在所有配置文件中都很常见,但最简单的配置文件除外

    要使用yaml定义上述“OutputDir”参数:

    xxx.yaml:

    OutputDir: DATA_DIR
    
    蛇形档案:

    configfile: 'xxx.yaml'
    
    include: 'xxx.py'
    
    include: 'xxx.py'
    rule:
        output: OutputDir + "/myfile.txt"
    
    要使用Python将其定义为与上述内容完全兼容,请执行以下操作:

    xxx.py:

    config['OutputDir'] = "DATA_DIR"
    
    OutputDir = "DATA_DIR"
    
    蛇形档案:

    configfile: 'xxx.yaml'
    
    include: 'xxx.py'
    
    include: 'xxx.py'
    rule:
        output: OutputDir + "/myfile.txt"
    
    或者,在包含Python的配置文件中定义一个简单变量“OutputDir”,然后在规则中使用它:

    xxx.py:

    config['OutputDir'] = "DATA_DIR"
    
    OutputDir = "DATA_DIR"
    
    蛇形档案:

    configfile: 'xxx.yaml'
    
    include: 'xxx.py'
    
    include: 'xxx.py'
    rule:
        output: OutputDir + "/myfile.txt"
    
    可以通过.yaml文件和python文件轻松定义和访问多嵌套字典和列表。例如:

    MACBOOK> cat cfgtest.yaml
    cfgtestYAML:
    
        A: 10
        B: [1, 2, 99]
        C:
            nst1: "hello"
            nst2: ["big", "world"]
    
    MACBOOK> cat cfgtest.py
    cfgtestPY = {
    
        'X': -2,
        'Y': range(4,7),
        'Z': {
            'nest1': "bye",
            'nest2': ["A", "list"]
            }
        }
    
    MACBOOK> cat cfgtest
    configfile: "cfgtest.yaml"
    include: "cfgtest.py"
    
    rule:
        output: 'cfgtest.txt'
        params: YAML=config["cfgtestYAML"], PY=cfgtestPY
        shell:
            """
            echo "params.YAML[A]: {params.YAML[A]}"             >{output}
            echo "params.YAML[B]: {params.YAML[B]}"             >>{output}
            echo "params.YAML[B][2]: {params.YAML[B][2]}"       >>{output}
            echo "params.YAML[C]: {params.YAML[C]}"             >>{output}
            echo "params.YAML[C][nst1]: {params.YAML[C][nst1]}" >>{output}
            echo "params.YAML[C][nst2]: {params.YAML[C][nst2]}" >>{output}
            echo "params.YAML[C][nst2][1]: {params.YAML[C][nst2][1]}" >>{output}
    
            echo "" >>{output}
    
            echo "params.PY[X]: {params.PY[X]}"                 >>{output}
            echo "params.PY[Y]: {params.PY[Y]}"                 >>{output}
            echo "params.PY[Y][2]: {params.PY[Y][2]}"           >>{output}
            echo "params.PY[Z]: {params.PY[Z]}"                 >>{output}
            echo "params.PY[Z][nest1]: {params.PY[Z][nest1]}"     >>{output}
            echo "params.PY[Z][nest2]: {params.PY[Z][nest2]}"     >>{output}
            echo "params.PY[Z][nest2][1]: {params.PY[Z][nest2][1]}" >>{output}
            """
    
    MACBOOK> snakemake -s cfgtest
    Provided cores: 1
    Rules claiming more threads will be scaled down.
    Job counts:
        count   jobs
        1   1
        1
    
    rule 1:
        output: cfgtest.txt
        jobid: 0
    
    Finished job 0.
    1 of 1 steps (100%) done
    
    MACBOOK> cat cfgtest.txt
    params.YAML[A]: 10
    params.YAML[B]: 1 2 99
    params.YAML[B][2]: 99
    params.YAML[C]: {'nst1': 'hello', 'nst2': ['big', 'world']}
    params.YAML[C][nst1]: hello
    params.YAML[C][nst2]: big world
    params.YAML[C][nst2][1]: world
    
    params.PY[X]: -2
    params.PY[Y]: range(4, 7)
    params.PY[Y][2]: 6
    params.PY[Z]: {'nest1': 'bye', 'nest2': ['A', 'list']}
    params.PY[Z][nest1]: bye
    params.PY[Z][nest2]: A list
    params.PY[Z][nest2][1]: list
    
    在snakemake规则中是否有充分描述配置数据使用的地方

    如果可以将配置文件解析为python对象,则可以在配置文件中输入的内容没有限制。基本上,“你的想象力就是极限”

    在输出规则中使用配置数据的正确方法是什么,例如帮助形成输出文件名

    我从配置中提取规则之外的东西,使用纯python

    我将执行以下操作,而不是
    输出:“{config.dataFolder}/{ID}/{ID}.yyy”

    data_folder = config.dataFolder
    
    rule name_of_the_rule:
        output:unction
            os.path.join(data_folder, "{ID}", "{ID}.yyy")
    
    我猜,在您尝试的情况下,snakemake在设置字符串格式时遇到了一些问题,其中包括来自通配符和其他内容的混合。但是,在Python3.6中,使用:
    output:f“{conf