13

ファイルに対していくつかの作業を行うスクリプトがあるとしましょう。コマンドラインでこのファイルの名前を使用しますが、指定されていない場合は、デフォルトで既知のファイル名(content.txtたとえば)になります。Pythonargparseでは、次を使用します。

parser = argparse.ArgumentParser(description='my illustrative example')
parser.add_argument('--content', metavar='file', 
                     default='content.txt', type=argparse.FileType('r'),
                     help='file to process (defaults to content.txt)')
args = parser.parse_args()
# do some work on args.content, which is a file-like object

これはうまくいきます。唯一の問題は、を実行するpython myscript --helpArgumentError、ファイルがそこにない場合(これは理にかなっていると思います)が表示され、ヘルプテキストが表示されないことです。ユーザーが必要な場合は、ファイルを開こうとしないほうがいい--helpです。これを行う方法はありますか?引数を文字列にして、後で自分でファイルを開くことができることはわかっています(そして、私はそれを行っています)が、それをargparse処理しておくと便利です。

4

4 に答える 4

13

あなたはサブクラス化することができますargparse.FileType

import argparse
import warnings

class ForgivingFileType(argparse.FileType):
    def __call__(self, string):
        try:
            super(ForgivingFileType,self).__call__(string)
        except IOError as err:
            warnings.warn(err)

parser = argparse.ArgumentParser(description='my illustrative example')
parser.add_argument('--content', metavar='file', 
                     default='content.txt', type=ForgivingFileType('r'),
                     help='file to process (defaults to content.txt)')
args = parser.parse_args()

これは、のようなプライベートメソッドに触れることなく機能しArgumentParser._parse_known_argsます。

于 2011-11-23T10:08:48.647 に答える
10

argparseコードを見ると、次のようになります。

  • ArgumentParser.parse_args呼び出しparse_known_argsて、解析する保留中の引数がないことを確認します。
  • ArgumentParser.parse_known_argsデフォルト値と呼び出しを設定しますArgumentParser._parse_known_args

したがって、回避策は、をArgumentParser._parse_known_args直接使用して検出-hし、その後はArgumentParser.parse_args通常どおりに使用することです。

import sys, argparse
parser = argparse.ArgumentParser(description='my illustrative example', argument_default=argparse.SUPPRESS)
parser.add_argument('--content', metavar='file',
                     default='content.txt', type=argparse.FileType('r'),
                     help='file to process (defaults to content.txt)')
parser._parse_known_args(sys.argv[1:], argparse.Namespace())
args = parser.parse_args()

ArgumentParser._parse_known_argsコマンドラインからの引数と名前空間の2つのパラメーターが必要であることに注意してください。

もちろん、このアプローチは内部argparse実装を利用しており、将来変更される可能性があるため、お勧めしません。ただし、あまり面倒ではないので、メンテナンスのリスクが報われると思われる場合は、それでも使用することをお勧めします。

于 2011-11-23T09:35:49.163 に答える
2

デフォルトとしてstdinを使用します。

parser.add_argument('file', default='-', nargs='?', type=argparse.FileType('r'))
于 2016-10-22T20:32:24.233 に答える
1

おそらく、ファイルが存在するかどうかをチェックし、存在する場合はファイルハンドルを返し、そうでない場合は(または他の何か)ファイルハンドルを返す呼び出しでtype、独自actionの定義を行うことができます。add_argumentNone

これには、自分自身のコードも作成する必要がありますが、デフォルト値を常に使用できるとは限らない場合は、遅かれ早かれチェックを行う必要があります。マニーDが主張するように、デフォルト値を再検討することをお勧めします。

于 2011-11-23T09:46:04.007 に答える