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

64
5

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

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

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

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

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

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

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

спросил(а) 2021-01-19T22:48:13+03:00 6 месяцев, 1 неделя назад
1
Решение
64

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

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

ответил(а) 2021-01-19T22:48:13+03:00 6 месяцев, 1 неделя назад
45

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

ID = str(os.getpgrp())

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

ответил(а) 2021-01-19T22:48:13+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема