command_util
支持 GUN 风格参数
from xlib.util import command_util
def hello(str_info):
"""
eg: call
python <module>.py hello STR_INFO
python <module>.py hello --str_info=STR_INFO
python <module>.py hello --str_info STR_INFO
"""
print(str_info)
if __name__ == '__main__':
import sys
import inspect
def _usage(func_name=""):
"""
output the module usage
"""
print("Usage:")
print("-------------------------------------------------")
for k, v in sorted(globals().items(), key=lambda item: item[0]):
if func_name and func_name != k:
continue
if not inspect.isfunction(v) or k[0] == "_":
continue
args, __, __, defaults = inspect.getargspec(v)
#
# have defaults:
# def hello(str_info, test="world"):
# |
# V
# return: (args=['str_info', 'test'], varargs=None, keywords=None, defaults=('world',)
# no defaults:
# def echo2(str_info1, str_info2):
# |
# V
# return: (args=['str_info1', 'str_info2'], varargs=None, keywords=None, defaults=None)
#
# str(['str_info1', 'str_info2'])[1:-1].replace(",", "") ===> 'str_info1' 'str_info2'
#
if defaults:
args_all = str(args[:-len(defaults)])[1:-1].replace(",", ""), \
str(["%s=%s" % (a, b) for a, b in zip(args[-len(defaults):], defaults)])[1:-1].replace(",", "")
else:
args_all = str(v.__code__.co_varnames[:v.__code__.co_argcount])[1:-1].replace(",", "")
if not isinstance(args_all, tuple):
args_all = tuple(args_all.split(" "))
exe_info = "{file_name} {func_name} {args_all}".format(
file_name=sys.argv[0],
func_name=k,
args_all=" ".join(args_all))
print(exe_info)
# Python3 func_doc ==> __doc__
# https://bugs.launchpad.net/networking-odl/+bug/1844660
if func_name and v.__doc__:
print("\n".join(["\t" + line.strip() for line in v.__doc__.strip().split("\n")]))
print("-------------------------------------------------")
if len(sys.argv) < 2:
_usage()
sys.exit(-1)
else:
func = eval(sys.argv[1])
args = sys.argv[2:]
try:
r, extra_info = command_util.Call(fn=func, args=args)
except Exception:
_usage(func_name=sys.argv[1])
r = -1
import traceback
traceback.print_exc()
if isinstance(r, int):
sys.exit(r)
print(r)
可通过如下 command 命令调用 module 中的方法
python <module>.py hello STR_INFO
python <module>.py hello --str_info=STR_INFO
python <module>.py hello --str_info STR_INFO
Last updated