0

argparse を使用しようとしていますが、何らかの理由で位置パラメータをコマンド ラインの最初に指定する必要があるという問題が引き続き発生します。ファイル名のリストなので、ポジショナルを最後にしたいです。

    self.parser = ArgumentParser(description=program_license,
                     formatter_class=RawDescriptionHelpFormatter,
                     conflict_handler='resolve')
    self.parser.add_argument('-V', '--version',
                     action='version',
                     version=program_version_message)
    self.parser.add_argument('--logfile', action='store',
                     dest='logfile', default='daddyvision.log')
    self.parser.add_argument('prog', help=SUPPRESS, nargs=1)
    self.parser.add_argument('library', metavar="library", nargs='*')

    group_loglvl = self.parser.add_mutually_exclusive_group()
    group_loglvl.add_argument("--verbose", dest="loglevel",
                     action="store_const", const="VERBOSE",
                     default='INFO')
    group_loglvl.add_argument("--debug", dest="loglevel",
                     action="store_const", const="DEBUG")
    group_loglvl.add_argument("--trace", dest="loglevel",
                     action="store_const", const="TRACE")
    group_loglvl.add_argument("--quiet", dest="loglevel",
                     action="store_const", const="WARNING")
    group_loglvl.add_argument("--errors", dest="loglevel",
                     action="store_const", const="ERROR")

    args = self.parser.parse_args(arg)

コマンドラインが次の場合: pgm --error filename 「エラー: 認識できない引数: ファイル名」が表示されます

コマンド行が pgm filename --error の場合、エラーなしで動作します。

私は何を間違っていますか。私が読んだすべてのことから、ポジショナルが最初または最後に来る可能性があると私は信じています。Python 2.7 環境。

位置を必要とする場合 (nargs='+') は機能しますが、parm はオプションです。

4

1 に答える 1

0

コードをクリーンアップして、self. 私は をするのが好きでimport argparse、残りを貼り付けて、実行例を取得できます。

これをどのようにテストしていますか?

parser.parse_args('pgm --error filename'.split())

また

parser.parse_args('--error filename'.split())

parser.parse_args()解析しsys.argv[1:]ます。この argparse で名前が付けられたスクリプトを実行するpgmと、 parse が期待されます--error filename

SUPPRESSなしのヘルプは次のとおりです。

usage: ipython [-h] [-V] [--logfile LOGFILE]
               [--verbose | --debug | --trace | --quiet | --errors]
               prog [library [library ...]]

positional arguments:
  prog
  library

optional arguments:
  -h, --help         show this help message and exit
  ...
  --errors

とにかく、エラーの鍵はのprog [library [library ...]]一部ですusage

何が起こっているかとpgm --error filenameいうと、pgm文字列が と の両方prog='pgm'を設定しているということlibrary=[]です。*(または?)を使用libraryすると、文字列がまったくなくても満足できます。それをすると、文字列を置く場所がなくなりfilenameます。

pgm filename --errorを与えlibrary=['filename']ます。 --error pgm filenameも動作するはずです。

問題は、ポジショナルが最初 (または最後) でなければならないということではなく、一緒でなければならないということです (2 番目が '?' または '*' の場合)。

このバグ レポートの投稿では、'*' の位置指定とオプションの相互作用について説明しようとしています。

http://bugs.python.org/issue14191#msg185517


pgmがプログラム名の場合sys.argv[0]、argparse では必要ありません。引数を削除するprogと、問題は解決します (位置指定は 1 つだけです)。

于 2013-08-17T02:51:37.943 に答える