将具有多种功能的python脚本转换为SnakeMake工作流程

时间:2019-07-07 00:39:59

标签: python function snakemake

我有一个输入文件,每一行对应一个序列,我需要对这些序列中的每一个进行多次检查(已经使用python脚本进行了检查,具有多个功能)。这些检查(功能)中的某些互不依赖,可以同时运行。所以我虽然要使用Snakemake。

问题是,大多数示例使用了如此多的输入文件,而我只有一个文件,但是需要在文件的每一行上运行不同的shell。有人想出了什么主意/例子吗?

我的第二个问题是,我的python脚本中的某些函数不会打印出文件,而只是返回一些内容。虽然我已经看到大多数类似蛇的示例都有输出(它是一个文件)。如何在Snakemake工作流程中处理这些功能?我的意思是如何在不同的函数/规则/ ...之间传递参数?我希望我的要求很清楚。谢谢

我确实在网上浏览了教程和一些示例

我的python脚本如下:

def function1(arg1,arg2):   ...   返回列表

def function2(arg1,arg2):    ....    [写文件]

def function3(arg1,arg2):    ...    print('blah blah')

def main():    函数1(A,B)    函数2(A,B)    function3(A,B)

如果 name == main:   main()

我没有错误消息。但是,不知道如何将具有众多功能的脚本转换为Snakemake工作流程。

1 个答案:

答案 0 :(得分:1)

如果您提供了一个创建文件的系统(您可以简单地将函数的结果打印到文件中),则可以为函数定义单独的snakemake规则。实际上,snakemake会根据其生成的文件来决定要运行哪个规则。

这样,彼此不依赖的规则将能够并行运行。

from contextlib import redirect_stdout

def function1(arg1, arg2):
    # ...

def function2(arg1, arg2):
    # ...

def function3(arg1, arg2):
    # ...

A = ...
B = ...

rule all:
    input:
        "function1_result.txt",
        "function2_result.txt"
        "function3_result.txt"

rule run_function1:
    output:
        "function1_result.txt",
    run:
        l = function1(A, B)
        with open(input[0]) as fh:
            print(*l, sep="\n", file=fh)

rule run_function2:
    output:
        "function2_result.txt",
    run:
        # Assuming this writes "function2_result.txt":
        function2(A, B)

rule run_function3:
    output:
        "function3_result.txt",
    run:
        with open(input[0]) as fh:
            # see https://stackoverflow.com/a/55833804/1878788
            with redirect_stdout(fh):
                function3(A, B)

请注意,这不会并行处理输入文件的行。