Snakemake: как сохранить значение экземпляра в виде змеи в нескольких экземплярах одного вызова - PullRequest
0 голосов
/ 03 июля 2018

Я хочу сохранить некоторую информацию в коде 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? Поскольку он работает с 'shell', второй вызов не нужен специально для обработки оператора "output".

Ответы [ 2 ]

0 голосов
/ 21 августа 2018

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

ID = str(os.getpgrp())

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

0 голосов
/ 05 июля 2018

Действительно, когда вы используете блок выполнения, 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...