Специальный символ змеиной магии - PullRequest
1 голос
/ 28 апреля 2020

У меня есть правило Snakamake, в котором мой шаблон содержит специальные символы, поэтому я избегаю их, используя sub, см. Ответ здесь . Выходной файл: data/extract_AAV(1).csv.

import re
rule get_data:
    input:
    output: "data/extract_{re.sub(r'([()])', r'\\\1', filename)}.csv"
    shell: "python get_data.py --filename {re.sub(r'([()])', r'\\\1', wildcards.filename)}"

Однако я получаю сообщение об ошибке следующим образом:

модуль 're' не имеет атрибута 'sub (r' ('* 1010) *

Запуск модуля re работает нормально в Python:

filename = 'extract_AAV(1).csv'
print(re.sub(r'([()])', r'\\\1', filename)
# returns: extract_AAV\\(1\\).csv

Воспроизводимый пример ошибки при передаче символов подстановки со специальными символами из Snakemake в сценарий python выглядит следующим образом :

Файл Snakemake:

rule get_data:
     output: "extract_{sample}.csv"
     shell: "python run.py --fn {wildcards.sample}"

run.py

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--fn', type=str)
args = parser.parse_args()
import pandas as pd

df = pd.DataFrame({'a': [1,2,3]})
df.to_csv("extract_"+args.fn+'.csv')

команда для выполнения попытки 1:

$ snakemake extract_AAV(1).csv --cores 1
bash: syntax error near unexpected token `('

команда для выполнения попытки 2:

$ snakemake extract_AAV\(1\).csv --cores 1
Building DAG of jobs...
Using shell: /bin/bash
Provided cores: 1 (use --cores to define parallelism)
Rules claiming more threads will be scaled down.
Job counts:
        count   jobs
        1       get_data
        1

[Wed Apr 29 11:31:34 2020]
rule get_data:
    output: extract_AAV(1).csv
    jobid: 0
    wildcards: sample=AAV(1)
/bin/bash: -c: line 0: syntax error near unexpected token `('
/bin/bash: -c: line 0: `set -euo pipefail;  python run.py --fn AAV(1)'
[Wed Apr 29 11:31:34 2020]
Error in rule get_data:
    jobid: 0
    output: extract_AAV(1).csv
    shell:
        python run.py --fn AAV(1)
        (one of the commands exited with non-zero exit code; note that snakemake uses bash strict mode!)

Shutting down, this might take some time.
Exiting because a job execution failed. Look above for error message
Complete log: /home/XXXXX/.snakemake/log/2020-04-29T113134.773987.snakemake.log

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

В вашем случае нет необходимости экранировать символы в подстановочных знаках. Кроме того, подстановочный знак является просто идентификатором, выражения не допускаются. Сценарий ниже иллюстрирует, как создать файл data/extract_AAV(1).csv:

rule all:
    input: "data/extract_AAV(1).csv"

rule get_data:
    output: "data/extract_AAV({index}).csv"
    shell: "touch {output}"

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

rule all:
    input: "data/extract_AAV (1).csv"

rule get_data:
    output: "data/extract_AAV ({index}).csv"
    shell: "touch \"{output}\""
0 голосов
/ 29 апреля 2020

Либо я не могу воспроизвести проблему, либо вы делаете вещи более сложными, чем необходимо. Это работает для меня:

samples = ['AAV(1)', 'AAV(2)']

rule all:
    input:
        expand('data/extract_{sample}.csv', sample= samples),

wildcard_constraints:
    sample= '|'.join([re.escape(x) for x in samples]),

rule one:
    output:
        'data/extract_{sample}.csv'
    shell:
        r"""
        touch '{output}'
        """

(бит wildcard_constraints здесь не нужен, но я склонен использовать его довольно свободно).

Если это не поможет, вы можете опубликовать воспроизводимый пример?

...