1

argparse を使用して再帰的なプログラムを作成しています。必要な唯一の引数は、操作対象のファイル (または複数のファイル) です。再帰的に呼び出す場合、ファイル名は必要ありませんが (新しいディレクトリで呼び出すため)、オプションは必要です。問題は、argparse が と の両方python programname.py -options arg FILENAME FILENAMEを許可することpython programname.py FILENAME FILENAME -options argです。「-」を苦労して検索し、大量のifステートメントで解決することはできましたが、もっと良い方法があるはずだと感じています.

それが重要かどうかはわかりませんが、ここに私の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()

本当にありがとう!

4

2 に答える 2

7

あなたは自分の人生を難しくしているだけです。プログラムを再帰的にするのではなく、関数を再帰的にします。プログラムを再帰的にすることは、メモリを使い果たし、一般的にシステムを圧倒する優れた方法です。

再帰的な作業が、アプリケーションの別のインスタンスではなく、それ自体を呼び出す関数に限定されるように、アプリケーションを書き直してください。

または、より良いのは、再帰性を完全に排除することです。ディレクトリツリーを繰り返し処理しているようです。それを再帰的に行う理由はありません。実際、Python には、ディレクトリ ツリーをたどる処理を行うライブラリ関数がありますos.walkを参照してください。

于 2010-11-22T02:16:36.763 に答える
1

おそらく、プロセスレベルの再帰を行うべきではありません。そうは言っても、argparseの「-」の扱いはあなたが探しているツールを提供するかもしれないと思います(私が正しく理解していれば)。argparsedocで文字列「-」を検索します。

于 2010-11-22T02:48:15.653 に答える