Автоматизировать python argparse скрипт с предварительно сгенерированными входами - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть программа, которая принимает пути к папкам и другие входные данные через командную строку с argparse. Я хочу, чтобы этот скрипт запускался автоматически на сервере, но я также хочу сохранить его функциональность argparse на случай, если я хочу запустить скрипт вручную. Есть ли способ заставить скрипт использовать предварительно сгенерированные входные данные из файла, но также сохранить свою систему ввода на основе флагов с помощью argparse? Вот моя текущая реализация:

parser = argparse.ArgumentParser(description='runs batch workflow on root directory')
parser.add_argument("--root", type=str, default='./', help="the path to the root directory 
                    to process")
parser.add_argument("--data", type=str, default='MS', help="The type of data to calculate ")
args = parser.parse_args()

root_dir = args.root
option = args.data

Я довольно новичок в этом, и читаю документацию argparse и Этот вопрос о переполнении стека не совсем то, что я хочу, если возможно, я хотел бы сохранить root и флаги данных, а не просто заменить их входным файлом или стандартным вводом данных.

1 Ответ

1 голос
/ 17 апреля 2020

Если используется argparse, аргумент ключевого слова default является хорошим стандартным способом решения проблемы; встроить поведение программы по умолчанию в исходный код скрипта, а не во внешний файл конфигурации. Однако, если у вас есть несколько файлов конфигурации, которые вы хотите развернуть по-разному, упомянутый вами подход (предварительно сгенерированный из входных данных) является желательным.

argparse в словарь

Пространство имен argparse можно преобразовать в словарь. Это удобно, поскольку мы можем создать функцию, которая принимает словарь или аргументы ключевых слов, и заставить ее обрабатывать программу с помощью удобной сигнатуры функции. Также файловые парсеры могут так же легко загружать словари и взаимодействовать с одной и той же функцией. Модуль python json используется в качестве примера. Конечно, можно использовать и другие.

Пример Python

def main(arg1=None, arg2=None, arg3=None):
    print(f"{arg1}, {arg2}, {arg3}")

if __name__ == "__main__":
    import sys
    import json
    import argparse

    # script called with nothing -- load default
    if len(sys.argv) == 1:
        with open("default.json", "r") as dfp:
            conf = json.load(dfp)
        main(**conf)

    else: # parse arguments
        parser = argparse.ArgumentParser()
        parser.add_argument('-a1', dest='arg1', metavar='arg1', type=str)
        parser.add_argument('-a2', dest='arg2', metavar='arg2', type=str)
        parser.add_argument('-a3', dest='arg3', metavar='arg3', type=str)
        args = parser.parse_args()
        conf = vars(args)
        main(**conf)

по умолчанию. json

{
    "arg1" : "str1",
    "arg2" : "str2",
    "arg3" : "str3"
}

Использование Fire

Модуль python Fire также можно использовать более удобно. Он имеет несколько режимов, с которыми файл может взаимодействовать с минимальными усилиями. Репозиторий Github доступен здесь .

...