Передача путей к каталогам в виде строк в argparse в Python

1

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

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

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()
  • 0
    В вашем случае вы можете просто использовать глобальный массив sys.argv без разбора
  • 0
    @ grapes действительно, с sys.argv (теперь, когда я знаю, что он существует), это становится довольно тривиальным, спасибо, что поделились информацией. Тем не менее, я хотел бы знать, что я делаю неправильно с argparse, чтобы я мог научиться правильно его использовать.
Показать ещё 5 комментариев
Теги:
cmd
argparse
main

2 ответа

3
Лучший ответ

Если вы решили использовать 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

1

Вы можете удалить всю функцию 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])
  • 0
    Спасибо за редактирование @ grapes, при печати данных ... вызывать все "аргумент 0" действительно, не имеет смысла; = D
  • 0
    Это не было важным редактированием, я знаю, но со мной случилось, что меня опровергли за простую опечатку в примере, поэтому я исправил это)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню