Преобразование скрипта Python с несколькими функциями в рабочий процесс SnakeMake - PullRequest
1 голос
/ 07 июля 2019

У меня есть один входной файл, каждая строка которого соответствует одной последовательности, и мне нужно сделать несколько проверок для каждой из этих последовательностей (делая это уже с помощью скрипта Python, нескольких функций).Некоторые из этих проверок (функций) не зависят друг от друга и могут выполняться одновременно.Так что я хоть использовал Snakemake.

Проблема в том, что в большинстве примеров используется так много входных файлов, и у меня есть только один файл, но мне нужно запускать разные оболочки в каждой строке файла.Какие-нибудь идеи / примеры, которые кто-то придумал?

Мой второй вопрос: некоторые функции в моем скрипте python не распечатывают файлы, а просто возвращают что-то.В то время как я видел, что большинство змееподобных примеров имеют вывод (который является файлом).Как я могу справиться с этими функциями в рабочем процессе Snakemake?Я имею в виду, как я могу передавать аргументы между различными функциями / правилом / ... и т. Д.?Надеюсь, понятно, о чем я спрашиваю.Спасибо

Я просмотрел учебные пособия и некоторые примеры в Интернете

Мой скрипт на python выглядит так:

def function1 (arg1, arg2): ... return List

def function2 (arg1, arg2): .... [написать файл]

def function3 (arg1, arg2): ... print ('бла-бла')

def main (): function1 (A, B) function2 (A, B) function3 (A, B)

если имя == main: main ()

У меня нет сообщений об ошибках.Пока не знаю, как преобразовать мой скрипт с таким количеством функций в рабочий процесс Snakemake.

1 Ответ

1 голос
/ 11 июля 2019

Вы можете определить отдельные правила создания змеи для ваших функций, если вы придумали систему, которая создает файлы (это может быть просто распечатать результат вашей функции в файл).Действительно, 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)

Обратите внимание, что это не будет обрабатывать параллельно строки вашего входного файла.

...