Сценарий: у меня есть сценарий 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()
Если вы решили использовать 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
Вы можете удалить всю функцию 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])
sys.argv
без разбора