7

optparseからargparseに切り替えた後-奇妙なエラーが発生しました。Argparseは、スペースを残さない場合にのみ引数を解析します。

myScript.py -oOpt

または等号を入れてください:

myScript.py -o=Opt

そしてそれは通常の方法では機能しません:

myScript.py -o Opt

これが私のargparseの初期化です:

#!/usr/bin/env python
# to get description use the -h flag

import argparse, os, sys


# ======================
# Python2.7 is expected:

if sys.version_info[0] != 2 or sys.version_info[1] < 7:
    sys.exit('This program needs Python2.7+')


# ==========
# preambule:

desc = """Enter dirs in the current dir and makes gro out of state.cpt there."""
# parser = argparse.ArgumentParser()
parser = argparse.ArgumentParser(description=desc, version='2.3', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('-w', '--workWith',
                    help = 'to specify a Gromacs exec suffix', 
                    dest = 'wW',
                    action = 'store',
                    default = '-4.5.5-single',
                    )
parser.add_argument('-g', '--gro',
                    help = '.gro postfix: <nameOfTheDir><postfix>.gro', 
                    dest = 'myGroPostfix',
                    action = 'store',
                    default = "_membrane",
                    )
parser.add_argument('-H', '--here',
                    help = 'toggles - single (current) dir behaviour (the output will be state.gro)', 
                    dest = 'Here',
                    action = 'store_true',
                    )
parser.add_argument('-D', '--dirs',
                    help = 'include these dirs (python\'s rgxp in SINGLE quotes), defaults to \'\'', 
                    dest = 'inclDirs',
                    action = 'store',
                    default = '',
                    )

args = parser.parse_args()


print args.wW

編集

さらに:

 gmx_bk-simulate-mems.py -j bk-runs-mpi.bash -p 1 -w="-4.5.5-double_non-parallel_gcc" 2&> ../`date +%Y-%b-%d-%H%M%S`.log &

与える:

 gmx_bk-simulate-mems.py: error: unrecognized arguments: 2

オプションとして(またはオプションとして)argparse扱うように見えます!2&>2&>../date +%Y-%b-%d-%H%M%S.log

編集2

要約すると:

  • For-は不適切なオプション名ですargparse-"-4.5.5-double_non-parallel_gcc"そのため、asと書く必要があります-w="-4.5.5-double_non-parallel_gcc"optparseおよびbash(!)の場合、これは問題ありません。bashでもエラーが発生します-w="-4.5.5-double_non-parallel_gcc"-引数は="-4.5.5-double_non-parallel_gcc"(!)であると見なされます。

  • のようなものはありません2&>2>使用する必要があり、エラーは発生しません。

  • これはshell、行を引数に分割する人であり、python;ではありません。

  • argparseよりもはるかに優れていoptparseます。

4

1 に答える 1

12

まず、小さな違いを作る必要があります。モジュールはargparseコマンドライン引数を解析しませんが、シェルは解析します。シェルは、シェルに入力した行をトークンに変換する役割を果たします。トークンは、sys.argvコマンドライン引数の python 配列/シーケンスである に渡されます。モジュールは、argparseに表示される内容を単純に理解しますsys.argv

この区別により、気付いた両方の「エラー」が明確になります。まず、考えてみましょう-w "-4.5.5-double_non-parallel_gcc"(等号がないことに注意してください)。シェルはこれら 2 つのトークンを-wおよびとして解析し-4.5.5-double_non-parallel_gcc、これらの文字列は両方とも sys.argv に渡されます。等号がない場合、これは-w(引数なし) と引数-4として.5.5-double_non-parallel_gccの 2 つのオプションのように見えます。すべてが単一のトークンとして解析されるように、等号が必要です。

編集されたセクション

に関しては2&>、与えられたトークンが引数として扱われるかどうかを argparse が制御することは不可能です。何かが sys.argv にある場合、それはシェルがそれを引数として扱っていることを意味します。

ここの兆候はエラーメッセージです。メッセージはunrecognized arguments: 2&>ではなく、 であることに注意してくださいunrecognized arguments: 2。シェルは「&>」を出力リダイレクトとして認識し、それに応じて行の残り (ログ ファイルを含む) を解析します。渡される唯一の引数は「2」です。これ2&>は、実際のタイプのリダイレクトではないためです。(&>すでに stderr と stdout の両方をカバーしているので、それに何を2追加しますか?)

optparseコメントで、「2&>」を「処理」できると主張しました。実際にはそうではありません。optparseモジュールは正確に何を行いましたargparseが、optparse位置引数の検証は行いませんargparse。実際、optparse実際のプログラミング エラー (この場合2&>はシェル リダイレクトの一種として使用) が検出されずにすり抜けてしまいます! 元の optparse コードを投稿する必要がありますが、次のように引数を解析したと思われます。

opt, args = parser.parse_args()

あなたのスクリプトは位置引数を取らないので、その後何もしなかったと思いますargs。しかし、 を調べると、 が位置引数と見なされていたargsことがわかります。2

一般に、スクリプトが位置引数を取らず、 を使用する場合optparseは、次のように、位置引数を受け取っていないことを確認することをお勧めします。

opt, args = parser.parse_args()
if args:
    parser.error("script takes no positional arguments")

argparseモジュールはあなたのためにそれを行いますoptparse.

于 2012-04-11T14:36:05.573 に答える