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