2010-11-22 104 views
1

我在寫一個使用argparse的遞歸程序。唯一需要的參數是要執行的文件(或多個文件)。當我遞歸調用它時,我不需要文件名(因爲我將調用一個新目錄),但我需要這些選項。問題是,argparse允許python programname.py -options arg FILENAME FILENAMEpython 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文檔中搜索字符串「 - 」。