Search code examples
snakemake

Working directory when using include in snakemake for rules that use the report() function


I am using snakemake to program my workflows. In order to reuse code, the simplest way is to use the statement include: "path/to/other/Snakefile"

This works fine for most cases but fails when creating the reports via the report() function. The problem is that it does not find the .rst file that is specified for the caption.

Thus it seems that report() has the working directory in which the other Snakefile is located and not the one of the main Snakefile.

Is there a flexible workaround for this, so that it behaves as just being loaded into the Snakefile and then being executed as it were in the main Snakefile?

This is an example rule in another Snakemake file:

rule evaluation:
    input:
        "data/final_feature.model"
    output:
        report("data/results.txt",caption="report/evaluation.rst",category ="Evaluation")
    shell:
        "Rscript {scripts}/evaluation.R {input}"

This is included in the main Snakefile via:

include: "../General/subworkflows/evaluation.snakemake"

This is the error message showing that the file is not present:

WorkflowError:
Error loading caption file of output marked for report.
FileNotFoundError: [Errno 2] No such file or directory: '.../workflows/General/subworkflows/report/evaluation.rst'

Thank you for any help in advance!


Solution

  • One option may be to expand relative paths to absolute paths using os.path.abspath(). If the paths are relative to the directory where the Snakefile is, you may need instead to use workflow.basedir which contains the path to the Snakefile. For example:

    caption= os.path.join(workflow.basedir, "report/evaluation.rst")