web-dev-qa-db-ja.com

python argparse:認識されない引数

parsePlotSens.py -s bw heheを実行すると、heheは認識されない引数であると表示されます。ただし、parsePlotSens.py hehe -s bwを実行すれば問題ありません。理想的には、両方のケースで機能することを望みます。

任意のヒント?以下は私のコードです:

if __name__ == '__main__' :

    parser = argparse.ArgumentParser(prog='parsePlotSens');
    parser.add_argument('-s', '--sort', nargs =1, action = 'store', choices = ['mcs', 'bw'], default='mcs', help=sorthelp)
    parser.add_argument('filename', nargs ='+', action = 'store')
    option = parser.parse_args(sys.argv)
31
Yan Zhu

sys.argvの引数としてparse_argsを渡さないでください。使うだけ

option = parser.parse_args()

sys.argvparse_argsに渡すと、スクリプト自体のパスまたは名前がsys.argvの最初の項目になるため、option.filenameの値になります。 heheは未知の引数になります。

sys.argvを省略すると、parse_argssys.argvを期待どおりに解析します。

47
unutbu

未知の引数を許可することでこれを回避できます

交換

args = parser.parse_args()

args, unknown = parser.parse_known_args()
14
FacePalm

また、unutbuの答えを補完するものとして、このように辞書に引数を保存すると、テストが簡単になります。

args = vars(parser.parse_args())
print args

辞書を印刷します。

{'sort': ['bw'], 'filename': ['hehe']}

のような:

if args['sort'] == 'bw':
    # code here

...
4

これを完了するために answer ここで、未知の引数を取得して解析する例を示します。


import argparse

parser = argparse.ArgumentParser()
# we only have a know argument  as key-pair --known KNOWN
parser.add_argument('--known')

# test with known un unknown variables
args, unknown = parser.parse_known_args(["--known", "var", "--unknown", "bar", "--flag"])

unknown["--unknown", "bar", "--flag"]のようなリストを返します。解析するだけです。

keypairs = dict([unknown[i:i+2] for i in range(0, len(unknown), 1) if unknown[i].startswith("--") and not (unknown[i+1:i+2]+["--"])[0].startswith("--")])

flags = [unknown[i] for i in range(0, len(unknown), 2) if (unknown[i+1:i+2]+["--"])[0].startswith("--")]
0
aitorhh

私の状況は質問と同じではありませんが、エラーは同じです。

私の状況:

  1. Windows pycharmを使用したリモートdev(SFTP)があり、linuxで実行するためにアップロードします。
  2. pythonコマンドには、bashファイルで_\_のような改行があります。

    _python args_config.py \
        --arg1="hello" \
        --arg2="world"
    _

_python argparse: unrecognized arguments_ args not foundエラーが発生します。

問題は、bashファイルの改行がWindowsとLinuxで異なることです。

pycharm File -> Line Separators -> LF - Unix and OS X (\n)で設定するだけ

linuxにアップロードしてbashファイルを実行すると動作します!

0
Colin Wang