Преобразовать функцию __main__ из скрипта Python, предназначенного для командной строки, в вызываемую функцию - PullRequest
0 голосов
/ 19 декабря 2018

Я работаю с чьим-то кодом 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 голосов
/ 22 февраля 2019

Как насчет:

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'])
0 голосов
/ 19 декабря 2018

Да, самый простой способ - использовать stdlib runpy.

import runpy

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

И, пожалуйста, запомните, что вы никогда не пишете свои собственные сценарии подобным образом.Под условным условием должна быть только одна строка, и это должен быть вызов функции без аргументов, например:

if __name__ == "__main__":
    main()

Все, что больше - это слишком много.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...