Description
Summary
PR #2479 has broken my package (https://pypi.org/project/arcana/)
I am not quite sure what the rationale behind the changes are so it is difficult to know how to debug or whether there is something I can change in my package.
Actual behavior
Workflow exits with error
File "/Users/tclose/git/ni/arcana/test/mwe/nipype_pr2479/test.py", line 71, in <module>
study.data('out')
File "/Users/tclose/git/ni/arcana/arcana/study/base.py", line 325, in data
visit_ids=visit_ids)
File "/Users/tclose/git/ni/arcana/arcana/runner/base.py", line 37, in run
return workflow.run(plugin=self._plugin)
File "/Users/tclose/git/ni/nipype/nipype/pipeline/engine/workflows.py", line 595, in run
runner.run(execgraph, updatehash=updatehash, config=self.config)
File "/Users/tclose/git/ni/nipype/nipype/pipeline/plugins/linear.py", line 44, in run
node.run(updatehash=updatehash)
File "/Users/tclose/git/ni/nipype/nipype/pipeline/engine/nodes.py", line 480, in run
result = self._run_interface(execute=True)
File "/Users/tclose/git/ni/nipype/nipype/pipeline/engine/nodes.py", line 564, in _run_interface
return self._run_command(execute)
File "/Users/tclose/git/ni/arcana/arcana/node.py", line 59, in _run_command
result = self.nipype_cls._run_command(self, *args, **kwargs)
File "/Users/tclose/git/ni/nipype/nipype/pipeline/engine/nodes.py", line 888, in _run_command
self._collate_join_field_inputs()
File "/Users/tclose/git/ni/nipype/nipype/pipeline/engine/nodes.py", line 898, in _collate_join_field_inputs
val = self._collate_input_value(field)
File "/Users/tclose/git/ni/nipype/nipype/pipeline/engine/nodes.py", line 928, in _collate_input_value
for idx in range(self._next_slot_index)
File "/Users/tclose/git/ni/nipype/nipype/pipeline/engine/nodes.py", line 947, in _slot_value
field, index, e))
AttributeError: The join node pipeline1.pipeline1_subject_session_outputs does not have a slot field subject_session_pairsJ1 to hold the subject_session_pairs value at index 0: 'DynamicTraitedSpec' object has no attribute 'subject_session_pairsJ1'
Expected behavior
The workflow runs without error
How to replicate the behavior
See script below
Script/Workflow details
I have tried to come up with a MWE that doesn't use my package but it was proving difficult. However, you can now install my package with pip
pip install arcana
and run the following
import os.path
import shutil
from nipype import config
config.enable_debug_mode()
import nipype # @IgnorePep8
from nipype.interfaces.utility import IdentityInterface # @IgnorePep8
from arcana.dataset import DatasetMatch, DatasetSpec # @IgnorePep8
from arcana.data_format import text_format # @IgnorePep8
from arcana.study.base import Study, StudyMetaClass # @IgnorePep8
from arcana.archive.local import LocalArchive # @IgnorePep8
from arcana.runner import LinearRunner # @IgnorePep8
BASE_ARCHIVE_DIR = os.path.join(os.path.dirname(__file__), 'archives')
BASE_WORK_DIR = os.path.join(os.path.dirname(__file__), 'work')
print(nipype.get_info())
print(nipype.__version__)
class TestStudy(Study):
__metaclass__ = StudyMetaClass
add_data_specs = [
DatasetSpec('in', text_format),
DatasetSpec('out', text_format, 'pipeline')]
def pipeline(self, **kwargs):
pipeline = self.create_pipeline(
name='pipeline1',
inputs=[DatasetSpec('in', text_format)],
outputs=[DatasetSpec('out', text_format)],
desc="A dummy pipeline used to test 'run_pipeline' method",
version=1,
citations=[],
**kwargs)
ident = pipeline.create_node(IdentityInterface(['a']),
name="ident")
# Connect inputs
pipeline.connect_input('in', ident, 'a')
# Connect outputs
pipeline.connect_output('out', ident, 'a')
return pipeline
# Create archives
shutil.rmtree(BASE_ARCHIVE_DIR, ignore_errors=True)
shutil.rmtree(BASE_WORK_DIR, ignore_errors=True)
os.makedirs(BASE_ARCHIVE_DIR)
for sess in (['ARCHIVE1', 'SUBJECT', 'VISIT'],
['ARCHIVE2', 'SUBJECT1', 'VISIT1'],
['ARCHIVE2', 'SUBJECT1', 'VISIT2'],
['ARCHIVE2', 'SUBJECT2', 'VISIT1'],
['ARCHIVE2', 'SUBJECT2', 'VISIT2']):
sess_dir = os.path.join(*([BASE_ARCHIVE_DIR] + sess))
os.makedirs(sess_dir)
with open(os.path.join(sess_dir, 'in.txt'), 'w') as f:
f.write('in')
archive1_path = os.path.join(BASE_ARCHIVE_DIR, 'ARCHIVE1')
archive2_path = os.path.join(BASE_ARCHIVE_DIR, 'ARCHIVE2')
work1_path = os.path.join(BASE_WORK_DIR, 'WORK1')
work2_path = os.path.join(BASE_WORK_DIR, 'WORK2')
# Attempt to run with archive with 2 subjects and 2 visits
study = TestStudy('two',
LocalArchive(archive2_path),
LinearRunner(work2_path),
inputs=[DatasetMatch('in', text_format, 'in')])
# Fails here
study2.data('out')
print("Ran study 2")
#
study1 = TestStudy('one',
LocalArchive(archive1_path),
LinearRunner(work1_path),
inputs=[DatasetMatch('in', text_format, 'in')])
study1.data('out')
print("Ran study 1")
to reproduce the error
Platform details:
{'nibabel_version': '2.2.1', 'sys_executable': '/usr/local/opt/python@2/bin/python2.7', 'networkx_version': '1.9', 'numpy_version': '1.14.3', 'sys_platform': 'darwin', 'sys_version': '2.7.15 (default, May 1 2018, 16:44:08) \n[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1)]', 'commit_source': 'repository', 'commit_hash': '5a96ea54a', 'pkg_path': '/Users/tclose/git/ni/nipype/nipype', 'nipype_version': '1.0.4-dev+g5a96ea54a', 'traits_version': '4.6.0', 'scipy_version': '1.1.0'}
1.0.4-dev+g5a96ea54a
(problem arose in 1.0.1)
Execution environment
My Homebrew python 2 environment outside container