'Accessing the path of the `--configfile` within Snakefile

Using Snakemake, is there any way to access the path of a config file passed to the workflow using the --configfile flag?


From poking around in the source for the workflow object, I initially thought the following minimal Snakefile

print(str(workflow.configfiles))

would print a list containing all config files, but running snakemake --configfile [path/to/config/file] -j 1 simply prints an empty list (Snakemake 6.1.1).



Solution 1:[1]

Based on Dmitry Kuzminov's answer, a simple solution for the case when only a single config file is present would be:

import sys

args = sys.argv
config_path = args[args.index("--configfiles") + 1]
print(config_path)

Solution 2:[2]

Snakemake is a module of Python, and you may use all functions and variables that you would use in regular Python scripts. For example this code will print the command line arguments that you have specified running the Snakemake script:

import sys

print(sys.argv)

Solution 3:[3]

The answer by @MSR has a slight issue when running a workflow on cluster. Apparently, each job (rule) sent to the cluster will also run all the global code, however, it does not have --configfile in its sys.argv, which will result in an error when running the job. Instead, it has --configfiles, so what I had to do was:

if '--configfile' in sys.argv:
    i = sys.argv.index('--configfile')
elif '--configfiles' in sys.argv:
    i = sys.argv.index('--configfiles')
conf_path = sys.argv[i+1]

I don't know if that's the best solution, but it worked for me. Would be nice if snakemake had a more elegant way off accession the config path, like workflow.configfile.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 MSR
Solution 2 Dmitry Kuzminov
Solution 3 soungalo