def execute(client, output_file, output_paths=None):
    """Run the generated workflow using cwltool library."""
    output_paths = output_paths or set()

    import cwltool.factory
    from cwltool import workflow
    from cwltool.context import LoadingContext, RuntimeContext
    from cwltool.utils import visit_class

    def construct_tool_object(toolpath_object, *args, **kwargs):
        """Fix missing locations."""
        protocol = 'file://'

        def addLocation(d):
            if 'location' not in d and 'path' in d:
                d['location'] = protocol + d['path']

        visit_class(toolpath_object, ('File', 'Directory'), addLocation)
        return workflow.default_make_tool(toolpath_object, *args, **kwargs)

    argv = sys.argv
    sys.argv = ['cwltool']

    # Keep all environment variables.
    runtime_context = RuntimeContext(
        kwargs={
            'rm_tmpdir': False,
            'move_outputs': 'leave',
            'preserve_entire_environment': True,
        }
    )
    loading_context = LoadingContext(
        kwargs={
            'construct_tool_object': construct_tool_object,
        }
    )

    factory = cwltool.factory.Factory(
        loading_context=loading_context,
        runtime_context=runtime_context,
    )
    process = factory.make(os.path.relpath(str(output_file)))
    outputs = process()

    sys.argv = argv

    # Move outputs to correct location in the repository.
    output_dirs = process.factory.executor.output_dirs

    def remove_prefix(location, prefix='file://'):
        if location.startswith(prefix):
            return location[len(prefix):]
        return location

    locations = {
        remove_prefix(output['location'])
        for output in outputs.values()
    }

    with progressbar(
        locations,
        label='Moving outputs',
    ) as bar:
        for location in bar:
            for output_dir in output_dirs:
                if location.startswith(output_dir):
                    output_path = location[len(output_dir):].lstrip(
                        os.path.sep
                    )
                    destination = client.path / output_path
                    if destination.is_dir():
                        shutil.rmtree(str(destination))
                        destination = destination.parent
                    shutil.move(location, str(destination))
                    continue

    unchanged_paths = client.remove_unmodified(output_paths)
    if unchanged_paths:
        click.echo(
            'Unchanged files:\n\n\t{0}'.format(
                '\n\t'.join(
                    click.style(path, fg='yellow') for path in unchanged_paths
                )
            )
        )
def execute ( client , output_file , output_paths = None ) : output_paths = output_paths or set ( ) import cwltool . factory from cwltool import workflow from cwltool . context import LoadingContext , RuntimeContext from cwltool . utils import visit_class def construct_tool_object ( toolpath_object , * args , ** kwargs ) : protocol = 'file://' def addLocation ( d ) : if 'location' not in d and 'path' in d : d [ 'location' ] = protocol + d [ 'path' ] visit_class ( toolpath_object , ( 'File' , 'Directory' ) , addLocation ) return workflow . default_make_tool ( toolpath_object , * args , ** kwargs ) argv = sys . argv sys . argv = [ 'cwltool' ] runtime_context = RuntimeContext ( kwargs = { 'rm_tmpdir' : False , 'move_outputs' : 'leave' , 'preserve_entire_environment' : True , } ) loading_context = LoadingContext ( kwargs = { 'construct_tool_object' : construct_tool_object , } ) factory = cwltool . factory . Factory ( loading_context = loading_context , runtime_context = runtime_context , ) process = factory . make ( os . path . relpath ( str ( output_file ) ) ) outputs = process ( ) sys . argv = argv output_dirs = process . factory . executor . output_dirs def remove_prefix ( location , prefix = 'file://' ) : if location . startswith ( prefix ) : return location [ len ( prefix ) : ] return location locations = { remove_prefix ( output [ 'location' ] ) for output in outputs . values ( ) } with progressbar ( locations , label = 'Moving outputs' , ) as bar : for location in bar : for output_dir in output_dirs : if location . startswith ( output_dir ) : output_path = location [ len ( output_dir ) : ] . lstrip ( os . path . sep ) destination = client . path / output_path if destination . is_dir ( ) : shutil . rmtree ( str ( destination ) ) destination = destination . parent shutil . move ( location , str ( destination ) ) continue unchanged_paths = client . remove_unmodified ( output_paths ) if unchanged_paths : click . echo ( 'Unchanged files:\n\n\t{0}' . format ( '\n\t' . join ( click . style ( path , fg = 'yellow' ) for path in unchanged_paths ) ) )
Run the generated workflow using cwltool library.