4

次の使用法を検討してください。

usage: do.py [-h] [-s | -m] filename

これは完全な使用法ではありません。しかし、私は事実上filename、ファイルの実際の値であり、次の値ではないことを望んでいます。

--filename FILENAME

ただしfilename、標準入力から読み取ることができるように、オプションである必要があります。catUNIXのプログラムについて考えてみてください。

あなたは単に言う:

cat filename

また

cat

編集:今、do.pyコマンドラインオプションなしでプログラムを実行すると、が表示されますerror: too few arguments。代わりに、有効なを指定しなくても、実行したいと思いますfilename。それ、どうやったら出来るの?

4

1 に答える 1

7

更新2: ArgParseドキュメントから、

nargs ='?'のより一般的な使用法の1つ オプションの入力ファイルと出力ファイルを許可することです。

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),
...                     default=sys.stdin)
>>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),
...                     default=sys.stdout)
>>> parser.parse_args(['input.txt', 'output.txt'])
Namespace(infile=<open file 'input.txt', mode 'r' at 0x...>,
          outfile=<open file 'output.txt', mode 'w' at 0x...>)
>>> parser.parse_args([])
Namespace(infile=<open file '<stdin>', mode 'r' at 0x...>,
          outfile=<open file '<stdout>', mode 'w' at 0x...>)

元の答え:

これは簡単です。デフォルト値と。を使用して位置引数を追加するだけですnargs='*'。引数がゼロの場合はデフォルト値が使用され、それ以外の場合はコマンドラインの引数が使用されます。

>>> p = argparse.ArgumentParser()
>>> p.add_argument('filename', nargs='*', default=['-'])
>>> p.parse_args([])
Namespace(filename=['-'])
>>> p.parse_args(['abc'])
Namespace(filename=['abc'])

通常、-標準入力/標準出力を参照するために使用されます。

次に、次のようなことを行います。

def get_inputs(ns):
    """Iterate over input files."""
    for path in ns.filename:
        if path == '-':
            yield sys.stdin
        else:
            yield open(path, 'r')

更新:複数のファイル名を使用するため、複数のファイル名が必要だと思いましcatた。nargs='?'ゼロまたは1つのファイル名が必要な場合に使用できます。

于 2013-02-13T00:20:40.187 に答える