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

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

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

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

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

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

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

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

2 ответа

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

Я не уверен, что именно вы хотите достичь, но это может помочь посмотреть на это: http://snakemake.readthedocs.io/en/stable/project_info/faq.html

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

ID = str(os.getpgrp())

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

Другие вопросы по тегам