699 def fillFromArgs(self, listOfArgs=None, parser=None, return_unknown=False):
700 """
701 Used to set flags from command-line parameters, like flags.fillFromArgs(sys.argv[1:])
702
703 if return_unknown=False, returns: args
704 otherwise returns: args, uknown_args
705 where unknown_args is the list of arguments that did not correspond to one of the flags
706 """
707 import sys
708
709 self._tryModify()
710
711 if parser is None:
712 parser = self.parser()
713 self._parser = parser
714 argList = listOfArgs if listOfArgs is not None else sys.argv[1:]
715 do_help = False
716
717
718
719
720 import argparse
721 unrequiredActions = []
722 if "-h" in argList or "--help" in argList:
723 do_help = True
724 if "-h" in argList: argList.remove("-h")
725 if "--help" in argList: argList.remove("--help")
726
727 for a in parser._actions:
728 if a.required:
729 unrequiredActions.append(a)
730 a.required = False
731 (args,leftover)=parser.parse_known_args(argList)
732 for a in unrequiredActions: a.required=True
733
734
735 argList = [a for a in argList if a not in leftover]
736
737
738 def arg_set(dest):
739 """Check if dest is available in parser and has been set"""
740 return vars(args).
get(dest,
None)
is not None
741
742 if arg_set('debug'):
743 self.Exec.DebugStage=args.debug
744
745 if arg_set('evtMax'):
746 self.Exec.MaxEvents=args.evtMax
747
748 if arg_set('interactive'):
749 self.Exec.Interactive=args.interactive
750
751 if arg_set('skipEvents'):
752 self.Exec.SkipEvents=args.skipEvents
753
754 if arg_set('filesInput'):
755 self.Input.Files = []
756 for f in args.filesInput.split(","):
757 found = glob.glob(f)
758
759 self.Input.Files += found if found else [f]
760
761 if "-l" in argList or "--loglevel" in argList:
762 from AthenaCommon import Constants
763 self.Exec.OutputLevel = getattr(Constants, args.loglevel)
764
765 if arg_set('config_only') and args.config_only is not False:
766 from os import environ
767 environ["PICKLECAFILE"] = "" if args.config_only is True else args.config_only
768
769 if arg_set('threads'):
770 self.Concurrency.NumThreads = args.threads
771
772
773
774 if args.concurrent_events is None and self.Concurrency.NumConcurrentEvents==0:
775 self.Concurrency.NumConcurrentEvents = args.threads
776
777 if arg_set('concurrent_events'):
778 self.Concurrency.NumConcurrentEvents = args.concurrent_events
779
780 if arg_set('nprocs'):
781 self.Concurrency.NumProcs = args.nprocs
782
783 if arg_set('perfmon'):
784 from PerfMonComps.PerfMonConfigHelpers import setPerfmonFlagsFromRunArgs
785 setPerfmonFlagsFromRunArgs(self, args)
786
787 if arg_set('mtes'):
788 self.Exec.MTEventService = args.mtes
789
790 if arg_set('mtes_channel'):
791 self.Exec.MTEventServiceChannel = args.mtes_channel
792
793 if arg_set('profile_python'):
794 from AthenaCommon.Debugging import dumpPythonProfile
795 import atexit, cProfile, functools
796 cProfile._athena_python_profiler = cProfile.Profile()
797 cProfile._athena_python_profiler.enable()
798
799
800 atexit.register(functools.partial(dumpPythonProfile, args.profile_python))
801
802 if arg_set('mpi'):
803 self.Exec.MPI = args.mpi
804
805
806 unknown_args = []
807 for arg in leftover:
808 if arg=='--':
809 argList += ["---"]
810 continue
811 if do_help and '=' not in arg:
812 argList += arg.split(".")
813 continue
814 try:
815 self.fillFromString(arg)
816 except KeyError as e:
817 if return_unknown:
818 unknown_args += [arg]
819 else:
820 raise e
821
822 if do_help:
823 if parser.epilog is None: parser.epilog=""
824 parser.epilog += " Note: Specify additional flags in form <flagName>=<value>."
825 subparsers = {"":[parser,parser.add_subparsers(help=argparse.SUPPRESS)]}
826
827 logging.root.setLevel(logging.ERROR)
828 def getParser(category):
829 if category not in subparsers.keys():
830 cat1,cat2 = category.rsplit(".",1) if "." in category else ("",category)
831 p,subp = getParser(cat1)
832 if subp.help==argparse.SUPPRESS:
833 subp.help = "Flag subcategories:"
834 newp = subp.add_parser(cat2,help="{} flags".format(category),
835 formatter_class = argparse.ArgumentDefaultsHelpFormatter,usage=argparse.SUPPRESS)
836 newp._positionals.title = "flags"
837 subparsers[category] = [newp,newp.add_subparsers(help=argparse.SUPPRESS)]
838 return subparsers[category]
839 self.loadAllDynamicFlags()
840 for name in sorted(self._flagdict):
841 category,flagName = name.rsplit(".",1) if "." in name else ("",name)
842 flag = self._flagdict[name]
843 try:
844 val = repr(flag.get(self))
845 except Exception:
846 val = None
847 if flag._help != argparse.SUPPRESS:
848 helptext = ""
849 if flag._help is not None:
850 helptext = f": {flag._help}"
851 if flag._type is not None:
852 helptext += f' [type: {flag._type.__name__}]'
853 if val is not None and helptext == "":
854 helptext = ": "
855 getParser(category)[0].add_argument(name, nargs='?', default=val, help=helptext)
856
857 parser._positionals.title = 'flags and positional arguments'
858 parser.parse_known_args(argList + ["--help"])
859
860 self._args = args
861
862 if return_unknown:
863 return args,unknown_args
864 else:
865 return args
866
867
868