Передача путей к каталогам в виде строк в argparse в Python - PullRequest
0 голосов
/ 09 января 2019

Сценарий: У меня есть сценарий python, который получает в качестве входных данных 2 пути к каталогам (входные и выходные папки) и идентификатор переменной. С их помощью он выполняет процедуру сбора данных из макросов xlsx и xlsm, изменяет данные и сохраняет их в csv (из входной папки внутренние функции кода запускают циклы, чтобы получить несколько файлов и обработать их, по одному за раз. время).

Проблема: Поскольку код работал нормально, когда я запускал его из консоли Spyder, я решил увеличить его и узнать о cmd caller, argparse и функции main, Я пытаюсь это реализовать, но получаю следующую ошибку:

Unrecognized arguments (the output path I pass from cmd)

Вопрос: Есть идеи, что я делаю не так?

Obs: Если требуется полный скрипт, я могу опубликовать его здесь, но, поскольку он работает при запуске из Spyder, я считаю, что ошибка в моей функции argparse.

Код (функция argparse и __main __):

# This is a function to parse arguments:
def parserfunc():
    import argparse
    parser = argparse.ArgumentParser(description='Process Files')
    parser.add_argument('strings', nargs=3)
    args = parser.parse_args()
    arguments = args.strings
    return arguments

# This is the main caller    
def main():
    arguments = parserfunc()
    # this next function is where I do the processing for the files, based on the paths and id provided):
    modifierfunc(arguments[0], arguments[1], arguments[2])

#
if __name__ == "__main__":
    main()

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Если вы решили использовать argparse, используйте именованные аргументы, а не индексированные. Ниже приведен пример кода:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('input')
parser.add_argument('output')
parser.add_argument('id')

args = parser.parse_args()
print(args.input, args.output, args.id) # this is how you use them

В случае пропуска одного из них при запуске программы вы получите сообщение об ошибке, читаемое человеком, например

ошибка: требуются следующие аргументы: id

0 голосов
/ 09 января 2019

Вы можете удалить всю функцию parserfunc (). sys.argv действительно содержит все аргументы (всегда обрабатываются как строка), как указано в винограде.

Итак, вместо этого:

modifierfunc(arguments[0], arguments[1], arguments[2])

Этого должно быть достаточно:

import sys
modifierfunc(sys.argv[0], sys.argv[1], sys.argv[2])

Возможно, сначала напечатайте, чтобы увидеть, содержит ли sys.argv ожидаемые вами значения.

print('Argument 0='+sys.argv[0])
print('Argument 1='+sys.argv[1])
print('Argument 2='+sys.argv[2])
...