Вы, вероятно, не хотите здесь прямого расширения, так как это произведет продукт каждой пары dir / id. Передайте 'zip' в качестве второго аргумента для расширения, чтобы просто сгенерировать существующие пары dir / id.
Если он висит на globbing, вы также можете включить ограничения подстановочных знаков, чтобы помочь механизму регулярных выражений.
Наконец, я не уверен, что делает ваш скрипт, но может помочь, чтобы ваше правило обрабатывало один файл за раз вместо того, чтобы брать все входы / выходы.
Редактировать, чтобы развернуть финал точка: Ваше текущее правило берет все входные данные и все выходные данные и предоставляет их сценарию. Допустим, ml/pos_tag.py
делает что-то вроде:
for infile, outfile in zip(snakemake.input, snakemake.output):
# do work on infile and store in outfile
Измените этот скрипт, чтобы он работал на одном инфиле для создания выходного файла. (Это предполагает, что файлы независимы, если вам действительно нужны все входные файлы, чтобы сделать вывод, это не правильно.)
# do work on snakemake.input[0] and store in snakemake.output[0]
Тогда ваш файл змеи становится:
raw_dirs, raw_files = glob_wildcards("../../my_data/{dir}/{id}.txt")
rule all:
input:
expand("../../my_data_tagged/{dir}/{id}.txt",
zip, dir=raw_dirs, id=raw_files)
rule p_tag:
input:
"../../my_data/{dir}/{id}.txt"
output:
"../../my_data_tagged/{dir}/{id}.txt"
script:
"ml/pos_tag.py"
Основным преимуществом является то, что вы можете заставить snakemake распараллеливать код вместо того, чтобы делать это в python.
Я внес изменение, добавив zip в раскрытие всего, и удалил защищенную маркировку, которая действительна только для выходы. Наконец, я сохранил выходные данные в новом каталоге, так как в противном случае последующие запуски будут соответствовать выходным данным:
"../../my_data/tagged/d1/id10.txt"
# ^ dir ^ ^id^