diff --git a/nipype/pipeline/engine/utils.py b/nipype/pipeline/engine/utils.py index 78d9417f9f..d7a65b74de 100644 --- a/nipype/pipeline/engine/utils.py +++ b/nipype/pipeline/engine/utils.py @@ -291,7 +291,7 @@ def load_resultfile(results_file, resolve=True): raise FileNotFoundError(results_file) result = loadpkl(results_file) - if resolve and result.outputs: + if resolve and getattr(result, "outputs", None): try: outputs = result.outputs.get() except TypeError: # This is a Bunch diff --git a/nipype/pipeline/plugins/tests/test_sgelike.py b/nipype/pipeline/plugins/tests/test_sgelike.py new file mode 100644 index 0000000000..9c7cdc1412 --- /dev/null +++ b/nipype/pipeline/plugins/tests/test_sgelike.py @@ -0,0 +1,35 @@ +from nipype.pipeline.plugins.base import SGELikeBatchManagerBase +from nipype.interfaces.utility import Function +import nipype.pipeline.engine as pe +import pytest +from unittest.mock import patch +import subprocess + + +def crasher(): + raise ValueError() + + +def submit_batchtask(self, scriptfile, node): + self._pending[1] = node.output_dir() + subprocess.call(["bash", scriptfile]) + return 1 + + +def is_pending(self, taskid): + return False + + +@patch.object(SGELikeBatchManagerBase, "_submit_batchtask", new=submit_batchtask) +@patch.object(SGELikeBatchManagerBase, "_is_pending", new=is_pending) +def test_crashfile_creation(tmp_path): + pipe = pe.Workflow(name="pipe", base_dir=str(tmp_path)) + pipe.config["execution"]["crashdump_dir"] = str(tmp_path) + pipe.add_nodes([pe.Node(interface=Function(function=crasher), name="crasher")]) + sgelike_plugin = SGELikeBatchManagerBase("") + with pytest.raises(RuntimeError) as e: + assert pipe.run(plugin=sgelike_plugin) + assert str(e.value) == "Workflow did not execute cleanly. Check log for details" + + crashfiles = tmp_path.glob("crash*crasher*.pklz") + assert len(list(crashfiles)) == 1