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