Как использовать snakemake.script в оболочках?

#snakemake

#snakemake

Вопрос:

Я пытался создать переносимые оболочки snakemake, которые выполняют предварительно созданные сценарии в «wrapper.py » сценарий. Однако до сих пор все примеры, которые я нашел, вызывали shell snakemake.shell функции для запуска из командной строки. Поэтому я подумал, что эквивалентом сценариев будет использование script from snakemake.script для выполнения сценариев. Но когда я использую это в правиле, оно выдает ошибку, подобную этой:

 Traceback (most recent call last):
  File "/home/robertlink/stack_overflow_dummy_example/.snakemake/scripts/tmpqfzkhuv_.wrapper.py", line 7, in <module>
    script("scripts/foo.py")
TypeError: script() missing 19 required positional arguments: 'basedir', 'input', 'output', 'params', 'wildcards', 'threads', 'resources', 'log', 'config', 'rulename', 'conda_env', 'container_img', 'singularity_args', 'env_modules', 'bench_record', 'jobid', 'bench_iteration', 'cleanup_scripts', and 'shadow_dir'
  

Есть ли способ легко получить информацию, необходимую для использования script ? Или я ошибаюсь, что я должен даже использовать script таким образом? Вот фиктивный пример для репликации сообщения:

Структура каталогов:

 .
├── Snakefile
└── wrapper
    └── path
        ├── scripts
        │   ├── bar.py
        │   └── foo.py
        └── wrapper.py
  

Snakefile:

 rule foobar:
    output:
        "foobar.txt"
    wrapper:
        "file:wrapper/path"
  

wrapper.py

 from snakemake.script import script

script("scripts/foo.py")
script("scripts/bar.py")
  

foo.py

 with open("foo_intermediate.txt", 'w') as handle:
    handle.write("foo")
  

bar.py

 with open("foo_intermediate.txt", 'w') as handle:
    foo = handle.read()
    
foo  = 'bar'

with open(snakemake.output) as handle:
    handle.write(foo)
  

команда выполнить:

 $ snakemake --cores 3
  

Любое понимание этого было бы замечательно. Спасибо!

Ответ №1:

Вам не нужно писать оболочку для вызова ваших скриптов — скрипты могут быть оболочкой. Может быть, взгляните на эту оболочку, основанную на Rscript, чтобы понять идею:

https://snakemake-wrappers.readthedocs.io/en/latest/wrappers/tximport.html

Комментарии:

1. Вы абсолютно правы. Для других, смотрящих на это, я просто свернул свои сценарии в wrapper.py сценарий и запустил его соответствующим образом. Спасибо, jafors!