706

私はもともとCプログラマーです。私は多くの異なる議論を読むための多くのトリックと「ハック」を見てきました。

Pythonプログラマーがこれを行う方法のいくつかは何ですか?

関連している

4

18 に答える 18

629
import sys

print("\n".join(sys.argv))

sys.argvコマンドラインでスクリプトに渡されるすべての引数を含むリストです。sys.argv[0]スクリプト名です。

基本的に、

import sys
print(sys.argv[1:])
于 2009-06-17T22:42:25.593 に答える
532

標準ライブラリの標準的なソリューションはargparsedocs)です。

次に例を示します。

from argparse import ArgumentParser

parser = ArgumentParser()
parser.add_argument("-f", "--file", dest="filename",
                    help="write report to FILE", metavar="FILE")
parser.add_argument("-q", "--quiet",
                    action="store_false", dest="verbose", default=True,
                    help="don't print status messages to stdout")

args = parser.parse_args()

argparse(とりわけ)サポート:

  • 任意の順序で複数のオプション。
  • 短いオプションと長いオプション。
  • デフォルト値。
  • 使用法のヘルプメッセージの生成。
于 2009-06-17T22:39:49.937 に答える
131

これらの理由でより良いargparseのために伝道を回るだけです..本質的に:

(リンクからコピー)

  • argparseモジュールは位置引数とオプションの引数を処理できますが、optparseはオプションの引数のみを処理できます

  • argparseは、コマンドラインインターフェイスがどのように表示されるかについて独断的ではありません。必須オプションと同様に、-fileや/fileなどのオプションがサポートされています。Optparseはこれらの機能のサポートを拒否し、実用性よりも純粋さを優先します

  • argparseは、引数から決定されたコマンドラインの使用法や、定位置引数とオプションの引数の両方のヘルプメッセージなど、より有益な使用法メッセージを生成します。optparseモジュールでは、独自の使用法文字列を作成する必要があり、位置引数のヘルプを表示する方法はありません。

  • argparseは、可変数のコマンドライン引数を消費するアクションをサポートしますが、optparseでは、引数の正確な数(1、2、または3など)が事前にわかっている必要があります。

  • argparseはサブコマンドにディスパッチするパーサーをサポートしますが、optparseは allow_interspersed_argsパーサーディスパッチを手動で設定して実行する必要があります

そして私の個人的なお気に入り:

  • argparseを使用すると、タイプとアクションのパラメーターをadd_argument() 単純な呼び出し可能オブジェクトで指定できますが、optparseでは、 STORE_ACTIONSまたはのようなクラス属性をハッキングCHECK_METHODSして、適切な引数チェックを取得する必要があります。
于 2009-06-26T18:15:02.380 に答える
72

argparsestdlibモジュール(stdlibのモジュールの「実装」 )もありoptparseます。argparseの紹介からの例:

# script.py
import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument(
        'integers', metavar='int', type=int, choices=range(10),
         nargs='+', help='an integer in the range 0..9')
    parser.add_argument(
        '--sum', dest='accumulate', action='store_const', const=sum,
        default=max, help='sum the integers (default: find the max)')

    args = parser.parse_args()
    print(args.accumulate(args.integers))

使用法:

$ script.py 1 2 3 4
4

$ script.py --sum 1 2 3 4
10
于 2009-06-18T03:12:25.283 に答える
63

速くて柔軟性のないものが必要な場合

main.py:

import sys

first_name = sys.argv[1]
last_name = sys.argv[2]
print("Hello " + first_name + " " + last_name)

次に実行しますpython main.py James Smith

次の出力を生成します。

こんにちはジェームススミス

于 2015-10-25T11:40:25.450 に答える
51

これを行う1つの方法は、を使用することですsys.argv。これにより、スクリプト名が最初の引数として出力され、他のすべてのパラメーターが渡されます。

import sys

for arg in sys.argv:
    print arg
于 2009-06-17T22:43:08.573 に答える
50

docoptライブラリは本当に洗練されています。アプリの使用法文字列から引数dictを作成します。

例:docopt readmeから:

"""Naval Fate.

Usage:
  naval_fate.py ship new <name>...
  naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
  naval_fate.py ship shoot <x> <y>
  naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
  naval_fate.py (-h | --help)
  naval_fate.py --version

Options:
  -h --help     Show this screen.
  --version     Show version.
  --speed=<kn>  Speed in knots [default: 10].
  --moored      Moored (anchored) mine.
  --drifting    Drifting mine.

"""
from docopt import docopt


if __name__ == '__main__':
    arguments = docopt(__doc__, version='Naval Fate 2.0')
    print(arguments)
于 2013-02-09T16:52:31.510 に答える
26
#set default args as -h , if no args:
if len(sys.argv) == 1: sys.argv[1:] = ["-h"]
于 2012-05-11T03:53:30.243 に答える
20

私は自分でoptparseを使用していますが、SimonWillisonが最近導入したoptfuncライブラリで行っている方向性が本当に気に入っています。それはによって動作します:

「関数定義(その引数とそのデフォルト値を含む)を内省し、それを使用してコマンドライン引数パーサーを構築します。」

したがって、たとえば、この関数の定義は次のとおりです。

def geocode(s, api_key='', geocoder='google', list_geocoders=False):

このoptparseヘルプテキストに変換されます:

    Options:
      -h, --help            show this help message and exit
      -l, --list-geocoders
      -a API_KEY, --api-key=API_KEY
      -g GEOCODER, --geocoder=GEOCODER
于 2009-06-18T04:07:57.923 に答える
9

stdlibのgetoptが好きです。例:

try:
    opts, args = getopt.getopt(sys.argv[1:], 'h', ['help'])
except getopt.GetoptError, err: 
    usage(err)

for opt, arg in opts:
    if opt in ('-h', '--help'): 
        usage()

if len(args) != 1:
    usage("specify thing...")

最近、これに似たものをラップして、冗長性を減らしています(たとえば、「-h」を暗黙的にする)。

于 2009-06-18T01:30:28.080 に答える
8

ご覧のとおり、 optparseは「optparseモジュールは非推奨であり、これ以上開発されることはありません。開発はargparseモジュールで続行されます。」

于 2011-08-23T12:57:14.650 に答える
8

Pocooのクリックはより直感的で、必要な定型文が少なく、少なくともargparseと同じくらい強力です。

私がこれまでに遭遇した唯一の弱点は、ヘルプページをあまりカスタマイズできないことですが、通常はそれは必須ではなく、docoptが必要な場合は明確な選択のようです。

于 2014-08-12T19:38:40.957 に答える
6
import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                   help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                   const=sum, default=max,
                   help='sum the integers (default: find the max)')

args = parser.parse_args()
print(args.accumulate(args.integers))

Assuming the Python code above is saved into a file called prog.py
$ python prog.py -h

Ref-link: https://docs.python.org/3.3/library/argparse.html
于 2017-10-07T03:25:07.257 に答える
5

コマンドライン引数の処理をさらに簡単にするために私が書いた小さなPythonモジュールに興味があるかもしれません(オープンソースで自由に使用できます)-Commando

于 2011-02-06T19:28:43.630 に答える
5

さらに別のオプションはarghです。argparseに基づいて構築されており、次のように記述できます。

import argh

# declaring:

def echo(text):
    "Returns given word as is."
    return text

def greet(name, greeting='Hello'):
    "Greets the user with given name. The greeting is customizable."
    return greeting + ', ' + name

# assembling:

parser = argh.ArghParser()
parser.add_commands([echo, greet])

# dispatching:

if __name__ == '__main__':
    parser.dispatch()

ヘルプなどが自動的に生成され、デコレータを使用して、arg-parsingがどのように機能するかについての追加のガイダンスを提供できます。

于 2015-11-11T22:10:35.503 に答える
4

これらの他のものの単純な代替手段としてdocoptを検討することをお勧めします。

docoptは、すべてを自分で実装する必要はなく、-helpの使用法メッセージを解析することで機能する新しいプロジェクトです。使用法メッセージをPOSIX形式で入力するだけです。

于 2013-08-18T06:21:51.340 に答える
2

また、python3では、Extended Iterable Unpackingを使用して、追加の依存関係なしでオプションの位置引数を処理すると便利な場合があります。

try:
   _, arg1, arg2, arg3, *_ = sys.argv + [None] * 2
except ValueError:
   print("Not enough arguments", file=sys.stderr) # unhandled exception traceback is meaningful enough also
   exit(-1)

上記のargv解凍によりarg2arg3「オプション」になります。で指定されていないargv場合はNoneになり、最初のアンパックが指定されていない場合はValueErrorが発生します。

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    _, arg1, arg2, arg3, *_ = sys.argv + [None] * 2
ValueError: not enough values to unpack (expected at least 4, got 3)
于 2020-12-04T13:20:55.913 に答える
0

私の解決策はentrypoint2です。例:

from entrypoint2 import entrypoint
@entrypoint
def add(file, quiet=True): 
    ''' This function writes report.

    :param file: write report to FILE
    :param quiet: don't print status messages to stdout
    '''
    print file,quiet

ヘルプテキスト:

usage: report.py [-h] [-q] [--debug] file

This function writes report.

positional arguments:
  file         write report to FILE

optional arguments:
  -h, --help   show this help message and exit
  -q, --quiet  don't print status messages to stdout
  --debug      set logging level to DEBUG
于 2011-10-24T12:48:37.020 に答える