【问题标题】:Converting a python script with multiple functions to SnakeMake workflow将具有多个函数的 python 脚本转换为 SnakeMake 工作流
【发布时间】:2019-11-17 00:09:25
【问题描述】:

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

问题是,大多数示例使用这么多输入文件,而我只有一个文件,但需要在文件的每一行上运行不同的 shell。有人提出了任何想法/示例?

我的第二个问题是,我的 python 脚本中的一些函数,不打印文件,而只是返回一些东西。虽然我见过大多数类似蛇的例子都有一个输出(这是一个文件)。如何处理 Snakemake 工作流程中的这些功能?我的意思是如何在不同的函数/规则/...等之间传递参数?我希望很清楚我在问什么。谢谢

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

我的 python 脚本如下所示:

定义函数1(arg1,arg2): ... 返回列表

定义函数2(arg1,arg2): …… [写入文件]

定义函数3(arg1,arg2): ... 打印('废话')

定义主(): 函数1(A,B) 函数2(A,B) 函数3(A,B)

如果 名称== 主要: 主要()

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

【问题讨论】:

    标签: python function snakemake


    【解决方案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)
    

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

    【讨论】:

    • 感谢您的建议。我最终做了类似的事情。虽然在这种情况下会有太多的 IO,但它可以完成工作。谢谢
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2018-04-28
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多