4

私は (昨日のように) Python を初めて使用するので、まだ「明らかなこと」がわからない場合はご容赦ください。

これには2つの方法がありますが、どちらもうまくいきますが、(読んでいるものから)欲しい/必要なものが含まれているかどうgetoptかわかりませんか?optparse次のようなことをしたいと思います。

python this.py --variable VariableName="Value" -v VariableName2="Value2"

また

python this.py --VariableName "Value"

私が直面している主な問題は、必要に応じて任意の変数を渡す必要があるかもしれないということですが、必ずしもすべてを特定の順序で渡す必要はありません (sys.argv私の場合、raw は機能しません)。これらの変数の一部については、文字列、数値、および/または配列を渡す場合があります。

変数がスクリプトに渡されたら、何らかの方法で変数が設定されているかどうかを確認し、必要に応じてデフォルト値を割り当てる必要があります。

ありがとう!

4

3 に答える 3

7

コマンドライン引数パーサーが絶対に必要です。Python にはいくつかのパッケージが付属しています。Python2.7 にはargparse、必要に応じて以前のバージョンに移植できるものがあり、私が推奨するものです。もありoptparseます。argparseほど良くはありませんが、それでもかなりのことができ、新しいバージョンだけでなく古いバージョンの Python でも利用できます。

もありますがgetopt、他のものと比較して言及する価値はほとんどありません。

于 2012-11-13T16:01:16.663 に答える
1

私は最初に自分の質問に答えます。

@mgilson の回答が気に入ったのと同じくらい、「より簡単な」方法を見つけました。私は正規表現に非常に慣れており、連想配列 (辞書など) を理解することはそれほど難しくありません。

import re

args = {}
args['pythonFile'] =  sys.argv[0]

for arg in sys.argv[1:]:
  variable = re.search('\-\-(.*)\=',arg)
  variable = variable.group(1)
  value = re.search('\=(.*)',arg)
  value = value.group(1)
  args[variable] = value

print args

証拠は次のとおりです。

$ /opt/python27/bin/python2.7 Test.py --var1=1 --var2="Testing This"
{'var1': '1', 'pythonFile': 'Test.py', 'var2': 'Testing This'}

ウット!

于 2012-11-13T18:46:20.743 に答える
1

上記のコードを少しリファクタリングして、より柔軟でモジュール化しました (ちなみに素晴らしいソリューションです)。--devの代わりに次のようなものを追加できるようになり--dev=trueました。または、両方を行うこともできます。引数を追加しなくても、アプリがクラッシュすることはありません。

def get_cli_args():
    """
    Returns a dictionary of arguments passed to through the CLI.
    """

    import re
    import sys

    args = {}

    for arg in sys.argv[1:]:
        var = re.search('\-\-([A-Za-z]*)', arg) # optional value assignment
        var = var.group(1)
        value = re.search('\=(.*)', arg)
        value = value.group(1) if value else None
        args[var] = value

    return args
于 2018-09-07T03:57:26.790 に答える