利用cwltool从CWL文件中提取出commandline

import os.path

from cwltool.main import setup_loadingContext, load_job_order, init_job_order
from cwltool.context import RuntimeContext
from cwltool.argparser import arg_parser
from cwltool.load_tool import resolve_tool_uri, make_tool, fetch_document, resolve_and_validate_document
from cwltool.flatten import flatten

import argcomplete
import sys
# import logging
# _logger = logging.getLogger("cwltool")
my_args = [ '/home/zcy/yy.cwl', '/home/zcy/custom-types.yml']
# my_args = ['/home/zcy/hello_world.cwl', '--message=zcy']
my_args = ['/home/zcy/bandage.cwl', '/home/zcy/aa.yml']
my_args = ['/home/zcy/bandage.cwl', '/home/zcy/output.json']
#my_args = ['/home/zcy/hello_world.cwl', '/home/zcy/hh.yml']
my_args = ['/home/zcy/stdout.cwl', '/home/zcy/echo-job.yml']
my_args = ['/home/zcy/other/bedtools_bamtobed_1.cwl', '/home/zcy/other/zzz.yml']
parser = arg_parser()
argcomplete.autocomplete(parser)
args = parser.parse_args(my_args)
runtimeContext = RuntimeContext(vars(args))
loadingContext = setup_loadingContext(None, runtimeContext, args)



# 'file:///home/zcy/yy.cwl'  'file:///home/zcy/yy.cwl' ,so tool_file_uri can be "" or 手动拼
# uri, tool_file_uri = resolve_tool_uri(
#             args.workflow,
#             resolver=loadingContext.resolver,
#             fetcher_constructor=loadingContext.fetcher_constructor,
#         )
uri = 'file://' + args.workflow
tool_file_uri = uri
job_order_object, input_basedir, jobloader = load_job_order(
                args,
                sys.stdin,
                loadingContext.fetcher_constructor,
                loadingContext.overrides_list,
                tool_file_uri,
            )


loadingContext, workflowobj, uri = fetch_document(uri, loadingContext)
loadingContext, uri = resolve_and_validate_document(
                loadingContext,
                workflowobj,
                uri,
                preprocess_only=(args.print_pre or args.pack),
            )


tool = make_tool(uri, loadingContext)
stdout = sys.stdout # cast(IO[str], stdout) todo
stdout = None
input_required = True # todo 会随着输入变化吗
initialized_job_order_object = init_job_order(
                    job_order_object,
                    args,
                    tool,
                    jobloader,
                    stdout,
                    print_input_deps=args.print_input_deps,
                    relative_deps=args.relative_deps,
                    make_fs_access=runtimeContext.make_fs_access,
                    input_basedir=input_basedir,
                    secret_store=runtimeContext.secret_store,
                    input_required=input_required,
                    runtime_context=runtimeContext,
                )


def output_callback(out, process_status: str):
    pass

jobiter = tool.job(initialized_job_order_object, output_callback, runtimeContext)

for job in jobiter:
    if job is not None:
        print(job.command_line)
        print(job.builder.bindings)
        my_job = job.builder.job
        for k,v in my_job.items():
            if isinstance(v, dict):
                if v.get('class') in ['File', 'Directory']:
                    v_location = v['location'][7:]
                    v['path'] = v_location
                    v['dirname'] = os.path.dirname(v_location)
        my_bindings = job.builder.bindings
        for rd in my_bindings:
            if isinstance(rd['datum'], dict):
                if rd['datum'].get('class') in ['File', 'Directory']:
                    rd_location = rd['datum']['location'][7:]
                    rd['datum']['path'] = rd_location
                    rd['datum']['dirname'] = os.path.dirname(rd_location)
        command_line = flatten(list(map(job.builder.generate_arg, my_bindings)))
        print(command_line)

 

posted on 2024-08-07 10:28  我和你并没有不同  阅读(1)  评论(0编辑  收藏  举报