Common errors¶
From time to time you’ll come across error messages in Janis, and hopefully they give you a good indication of what’s happened, but here we’ll address some.
If you’ve got a strange error message and don’t know what’s happening, post a message on Gitter or raise an issue on GitHub!
Command line positions¶
Command line positioning can be a little confusing. When running or translating you should follow this format:
janis run [run-arguments] yourworkflow.py [workflow-inputs]
Where
run-arguments
are options like--inputs
,--recipe
,--hint
,--engine
,--stay-connected
, etc.workflow-inputs
are additional inputs you
Errors:
- There were unrecognised inputs provided to the tool “yourtool”, keys: engine, recipe, hint, otherkey
- In the command line, you might have accidentally placed a run argument in the workflow inputs section. Eg: :
- Wrong:
janis run yourtool --engine cwltool
- Correct:
janis run --engine cwltool yourtool
- Wrong:
- You might have also included workflow inputs that yourtool did not recognise. Please ensure that yourtool accepts all the unrecognised keys.
- In the command line, you might have accidentally placed a run argument in the workflow inputs section. Eg: :
Finding files¶
Janis looks in a number of places outside just your current directory to find certain types of files. Janis will look in the following places for your file:
- The full path of the file (if relevant)
- Current directory
$JANIS_SEARCHPATH
(if defined in the environment).
If your path starts with https://
or http//
, the file will be downloaded to a cache in the configuration directory (default: ~/.janis/cache
) and will not go through the search path procedure.
You can run your command with janis -d yourcommand
and look for the following lines which tell you how Janis is searching for files:
[DEBUG]: Searching for a file called 'hellop'
[DEBUG]: Searching for file 'hellop' in the cwd, '/path/to/cwd/'
[DEBUG]: Attempting to get search path $JANIS_SEARCHPATH from environment variables
[DEBUG]: Got value for env JANIS_SEARCHPATH '/path/to/janis/', searching for file 'hellop' here.
[DEBUG]: Couldn't find a file with filename 'hellop' in any of the following: full path, current working directory (/path/to/cwd/) or the search path.
[DEBUG]: Setting CONSOLE_LEVEL to None while traversing modules
[DEBUG]: Restoring CONSOLE_LEVEL to DEBUG now that Janis shed has been hydrated
# It's now searching the registry and will fail after it can't find it.
Errors:
Exception: Couldn’t find workflow with name: myworkflow
This might occur during a
run
ortranslate
. Janis couldn’t findmyworkflow
in any of the usual spots, nor in the tool registry.- If you’re referencing a Python file (eg:
myworkflow.py
), try giving the full path to the file or ensure that it’s correctly in your search paths. - If you’re referencing a tool that should be in the store, check the spelling of the tool. The name you reference needs to be the ToolId (under
def tool(): return "toolid"
). - If you’re referencing a tool that you’re putting into the store, ensure there are no syntax / runtime errors in the Python file. You can double check this a few ways:
- Running
janis translate /path/to/your/file.py wdl
and ensure that runs correctly. - Adding an
if __name__ == "__main__": YourWorkflowClass().translate("wdl")
to the bottom of your python file, then runningpython /path/to/your/file.py
and checking that it translates correctly.
- Running
- If you’re referencing a Python file (eg:
FileNotFoundError: Couldn’t find inputs file: myinput.yml
This is likely because your inputs file
myinput.yml
couldn’t be found in the search path. Try giving the full path to your file.Unrecognised python file when getting workflow / command tool: hello.py :: $PYTHONERROR
This error results in a couple of ways:
- There was a problem when parsing your file (
hello.py
). The error (given by$PYTHONERROR
) was returned by Python when trying to interpret your file and get the workflow out. This could be syntactic or runtime error in your file. - You were looking a tool up in the registry, but you had a file / folder in your search path that caused a clash. You can include the
--registry
parameter after therun
to only look up the tool in the registry.
- There was a problem when parsing your file (
There was more than one workflow (3) detected in ‘hel.py’ (please specify the workflow to use via the
--name
parameter, this name must be the name of the variable or the class name and not the workflowId). Detected tokens: ‘HelloWorkflow’ (HelloWorkflow), ‘HelloWorkflow2’ (HelloWorkflow2), ‘w’ (HelloWorkflow)When looking for workflows and command tools within the file
myworkflow.py
, Janis found more than one workflow / command tool that could be run, in this case there were 3:- HelloWorkflow (
HelloWorkflow
) - HelloWorkflow2 (
HelloWorkflow2
) - w (
HelloWorkflow
)
You need to specify the
--name
parameter with one of these ids (HelloWorkflow
,HelloWorkflow2
orw
) to run / translate / etc.- HelloWorkflow (
ValueError: There were errors in 2 inputs: {’field1’: ‘value was null’, ‘field2’: ‘other reason’}
One or more of your inputs when running were invalid. The dictionary gives the field that was invalid (key) and the reason Janis thinks your value was invalid (value).
Containers¶
Exception: The tool ‘MyTool’ did not have a container. Although not recommended, Janis can export empty docker containers with the parameter
allow_empty_container=True
or--allow-empty-container
One of the tools that you are trying to run or translate did not have a container attached to this. In Janis, we strongly encourage the use of containers however it’s not always possible.
To allow a tool to be translated correctly, there are two mechanisms for doing so:
- Translate without a container
- CLI: Include the
--allow-empty-container
flag, eg:janis [translate|run] --allow-empty-container mytool
- API: Include
allow_empty_container=True
,mytool.translate("cwl", allow_empty_container=True)
.
- CLI: Include the
- Override the container
- CLI with the syntax:
janis [translate|run] --container-override 'MyTool=myorganisation/mytool:0.10.0' mytool
- API: include container override dictionary:
mytool.translate("wdl", container_override={"mytool": "myorganisation/mytool:0.10.0"})
, the dictionary has structure:{toolId: container}
. The toolId can be an asterisk*
to override all tools’ containers.
- CLI with the syntax:
- Translate without a container