将__main__函数从用于命令行的Python脚本转换为可调用函数

时间:2018-12-18 23:29:06

标签: python function command-line

我正在使用某人的GitHub代码,该代码旨在像这样从命令行调用:

> python this_script.py -u <username> -p <password> -i <id_num> ...

this_script.py中以这种方式解析输入后,这将产生一个输出文本文件:

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='get data', add_help=False, usage='this_script.py -u username -p password [options]')
    parser.add_argument('-u', metavar='<STR>', type=str, help='username')
    parser.add_argument('-p', metavar='<STR>', type=str, help='password')
    parser.add_argument('-i', metavar='<STR>', nargs='+', type=str, help='List of IDs')
    ...

我想在自己的代码集中使用这些文本文件中的许多文本文件,因此使用如下语法将其从命令行脚本转换为可调用函数会更加方便:

def this_script(password, username, *args):
    ...

是否有一种简单的方法来执行此操作,而不必过多地破坏当前定义的__main__块的内部工作原理?

2 个答案:

答案 0 :(得分:0)

是的,简单的方法是使用stdlib runpy

import runpy

runpy.run_module(mod_name, init_globals=None, run_name=None, alter_sys=False)

而且,请记住不要写这样的脚本。条件下只能有一行,它应该是对不带参数的函数的调用,如下所示:

if __name__ == "__main__":
    main()

什么都太多了。

答案 1 :(得分:0)

怎么样:

def do_stuff(args):
    print(args.u)
    print(args.p)


def main(args_list=None):
    parser = argparse.ArgumentParser(description='get data', add_help=False, usage='this_script.py -u username -p password [options]')
    parser.add_argument('-u', metavar='<STR>', type=str, help='username')
    parser.add_argument('-p', metavar='<STR>', type=str, help='password')
    parser.add_argument('-i', metavar='<STR>', nargs='+', type=str, help='List of IDs')
    ...

    if args_list:
        args= parser.parse_args(args_list)
    else:
        args = parser.parse_args()

    do_stuff(args)


if __name__ == "__main__":
    main()

这样,您可以从命令行或代码中的某个地方(例如,与:

main(['-u', 'my_username', '-p', 'my_password'])