2010-11-22 3 views
1

Я пишу рекурсивную программу, используя argparse. Единственный требуемый аргумент - это файл (или файлы), который должен действовать. Когда я вызываю его рекурсивно, мне не нужны имена файлов (поскольку я буду звонить в новый каталог), но мне нужны параметры. проблема заключается в том, что argparse позволяет как python programname.py -options arg FILENAME FILENAME, так и python programname.py FILENAME FILENAME -options arg. Я мог бы тщательно искать «-» и работать с тоннами выражений if, но я чувствую, что должен быть лучший способ.рекурсия с python argparse

не уверено, что это важно, но вот мой argparse заявление:

parser = argparse.ArgumentParser(description='Personal upload script. (defaults to ' + user + '@' + server + directory + ')') 
parser.add_argument('files', nargs="+", help='file(s) to upload') 
parser.add_argument('-s', metavar='example.com', default=server, help='server to upload to') 
parser.add_argument('-u', metavar='username', default=user, help='ftp username') 
parser.add_argument('-p', metavar='password', default=password, help='ftp password') 
parser.add_argument('-d', metavar='example/', default=directory, help='directory to place file in') 
parser.add_argument('-n', metavar='myfile.txt', help='name to save file as') 
parser.add_argument('-c', metavar='###', help='chmod upload') 
parser.add_argument('-l', action='store_true', help='print out new url(s)') 
parser.add_argument('-r', action='store_true', help='recursive') 
parser.add_argument('-F', action='store_true', help='force (overwrite files/create non-existing dirs)') 
parser.add_argument('-v', action='store_true', help='verbose') 
args = parser.parse_args() 

спасибо так много!

ответ

7

Вы просто делаете жизнь трудной для себя. Вы не делаете программ рекурсивными, вы делаете функции рекурсивный. Создание рекурсивной программы - отличный способ исчерпать память и, как правило, подавить систему.

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

Или, лучше, полностью устранить рекурсию. Похоже, вы просто перебираете дерево каталогов. Нет причин делать это рекурсивно. Фактически, у Python есть функция библиотеки, которая позаботится о том, чтобы ходить по дереву каталогов для вас. См. os.walk.

1

Возможно, вы не должны выполнять рекурсию на уровне процесса. Тем не менее, я думаю, что обращение с помощью argparse «-» может предоставить инструмент, который вы ищете (если я правильно понимаю). Найдите файл argparse для строки «-».