I have a Python module modulename
installed in a conda environment called myenvname
.
My snakemake
file consists of one simple rule:
rule checker2: output: "tata.txt" conda: "myenvname" script: "scripts/test2.py"
The contents of the test2.py
are the following:
import modulename with open("tata.txt","w") as _f: _f.write(modulename.__version__)
When I run the above snakemake file with the command snakemake -j 1 --use-conda --conda-frontend conda
I get ModuleNotFoundError
, which would imply that there is no modulename
in my specified environment. However, when I do the following :
conda activate myenvname python workflow/scripts/test2.py
… everything works perfectly. I have no idea what’s going on.
The full error is pasted below, with some info omitted for privacy.
Traceback (most recent call last): File "/OMITTED/.snakemake/scripts/tmpheaxuqjn.test2.py", line 13, in <module> import cnvpytor as cnv ModuleNotFoundError: No module named 'MODULENAME' [Thu Nov 17 18:27:22 2022] Error in rule checker2: jobid: 0 output: tata.txt conda-env: MYENVNAME RuleException: CalledProcessError in line 12 of /OMITTED/workflow/snakefile: Command 'source /apps/qiime2/miniconda3/bin/activate 'MYENVNAME'; set -euo pipefail; /OMITTED/.conda/envs/snakemake/bin/python3.1 /OMITTED/.snakemake/scripts/tmpheaxuqjn.test2.py' returned non-zero exit status 1. File "/OMITTED/workflow/snakefile", line 12, in __rule_checker2 File "/OMITTED/.conda/envs/snakemake/lib/python3.10/concurrent/futures/thread.py", line 58, in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Complete log: /OMITTED/.snakemake/log/2022-11-17T182715.495739.snakemake.log
EDIT: Typo in script fixed, the typo isn’t in the script I’m running so it’s not the issue here.
EDIT2:
I’ve tried two different attempts from comments. All three attempts
are run with the same CLI command snakemake -j 1 --use-conda --conda-frontend conda
Attempt 1
Rule in the snakemake:
rule checker3: output: "tata.txt" conda: "myenvname" shell: """ conda env list >> {output} conda list >> {output} """
In the output file I had the following (I have lots of environs and packages I’ve cut out):
# conda environments: # ... myenvname * /OMITTED/.conda/envs/myenvname ... # packages in environment at /OMITTED/.conda/envs/myenvname: # # Name Version Build Channel ... modulename 1.2 dev_0 <develop> ...
This attempt proves that the conda environment is activated and that this environment has modulename
.
Attempt 2
Same as running the script, but I’ve modified the script to include
import time; time.sleep(30); import modulename
So I can snag a runnable script before it’s deleted. The script has the following inserted at the start:
######## snakemake preamble start (automatically inserted, do not edit) ######## import sys; sys.path.extend(['/OMITTED/.conda/envs/snakemake/lib/python3.10/site-packages', '/OMITTED/MYWORKINGDIRECTORY/workflow/scripts']); import pickle; snakemake = pickle.loads(####a lot of stuff here###); from snakemake.logging import logger; logger.printshellcmds = False; __real_file__ = __file__; __file__ = '/OMITTED/MYWORKINGDIRECTORY/workflow/scripts/test3.py'; ######## snakemake preamble end #########
I have no idea what to do with this information.
Attempt 3
Instead of running script, I’ve ran a shell command that runs a python script.
rule checker4: output: "tata.txt" conda: "myenvname" shell: "python workflow/scripts/test3.py"
It worked (showed no errors), and when I open “tata.txt” I find “1.2” which is the version of of my module.
Conclusions
The snakemake actually activates proper environment, but the problem is in script
part. I have no idea why this is.
There is a similar question here, so this is a duplicate question.
Advertisement
Answer
Question is answered. Snakemake actually activates correct environment, but running a python script with the script
conflicts with this directive. I don’t know if this is a bug in snakemake
(version is 6.14.0
) or an intentional thing. I’ve solved the problem by running the python script via shell
command with python workflow/scripts/MyScript.py
– it’s a bit of a problem because I had to include a CLI wrapper that would normally be solved by a snakemake object.