Snakemake: как поддерживать значение экземпляра, похожее на змею, в нескольких экземплярах одного и того же вызова.

Я хочу сохранить некоторую информацию в коде python, который является частью моего файла змейки, и сделать эту информацию доступной для кода python в каждом экземпляре, создаваемом змейкой во время выполнения рабочего процесса. Но отдельный запуск рабочего процесса должен иметь свой отдельный экземпляр информации.

Например, предположим, что я должен создать UUID в своем коде Python, а затем использовать его в коде Python. Но я хочу, чтобы UUID был одинаковым во всех запущенных экземплярах рабочего процесса. Вместо этого новый UUID создается каждый раз при запуске экземпляра.

Если я запущу змейку дважды одновременно, я бы хотел, чтобы каждый из двух прогонов создавал свой собственный UUID, но в каждом прогоне все экземпляры, созданные прогоном, будут использовать один и тот же UUID. Как это сделать? Есть ли где-то в объекте змейки идентификатор, который остается одним и тем же в течение одного запуска для всех экземпляров, но изменяется от запуска к запуску?

Вот пример, который не работает с ошибкой «Нет правила для создания»:

import uuid
ID = str(uuid.uuid4())
print("ID:", ID)

rule all:
    output: ID
    run: print("Hello world")

Если вместо «запуска» используется «оболочка», все работает нормально, поэтому я предполагаю, что Snakemake перезапускает код файла змеи, когда выполняет часть «запуска» правила. Как это можно изменить для работы, чтобы сохранить первое значение UUID вместо создания второго? Кроме того, почему идентификатор, указанный для вывода в правиле, не фиксируется при первой обработке правила, не требуя повторного вызова кода Python? Поскольку он работает с «оболочкой», второй вызов не требуется специально для обработки оператора «выход».


person tedtoal    schedule 03.07.2018    source источник
comment
Будет ли работать правило set_uuid, которое генерирует этот uuid и записывает его на выходе, а все остальные правила имеют rules.set_uid.output на входе? Я предполагаю, что проблема будет в имени этого файла.   -  person bli    schedule 06.07.2018
comment
Да, точно, имя.   -  person tedtoal    schedule 06.07.2018


Ответы (2)


Действительно, когда вы используете блок выполнения, Snakemake вызывает себя для выполнения этого задания, а это означает, что он также повторно анализирует Snakefile, создавая новый UUID. То же самое произойдет и с кластером. Для этого есть веские технические причины (производительность, Python GIL, ограничения при травлении, простота и надежность реализации).

Я не уверен, чего именно вы хотите достичь, но это может помочь взглянуть на это: http://snakemake.readthedocs.io/en/stable/project_info/faq.html#i-want-to-pass-variables-between-rules-is-that-possible

person Johannes Köster    schedule 05.07.2018
comment
Спасибо, Йоханнес, но я видел этот раздел и не думаю, что он решает проблему. Как можно создать постоянный словарь, который имел бы РАЗНЫЕ такие словари для каждого экземпляра запущенного файла змеи, но при повторном вызове ВНУТРИ экземпляра использовал бы ОДИНАКОВЫЙ словарь? Я просто не могу найти способ подключить мой работающий код Python к конкретному запуску файла конвейера. - person tedtoal; 06.07.2018

Я нашел метод, который работает: используйте идентификатор группы процессов:

ID = str(os.getpgrp())

Несколько экземпляров одного и того же конвейера имеют одинаковый идентификатор группы. Однако я не уверен, что это остается верным для кластера, возможно, нет. В моем случае это не имело значения.

person tedtoal    schedule 21.08.2018