12

私は試していましたoptparseが、これが私の最初のスクリプトです。

#!/usr/bin/env python

import os, sys
from optparse import OptionParser

parser = OptionParser()
usage = "usage: %prog [options] arg1 arg2"

parser.add_option("-d", "--dir", type="string",
                  help="List of directory",
                  dest="inDir", default=".")

parser.add_option("-m", "--month", type="int",
                  help="Numeric value of the month", 
                  dest="mon")

options, arguments = parser.parse_args()

if options.inDir:
    print os.listdir(options.inDir)

if options.mon:
    print options.mon

def no_opt()
    print "No option has been given!!"

今、これは私がやろうとしていることです:

  1. オプションに引数が指定されていない場合は、「デフォルト」値が使用されます。つまりmyScript.py -d、現在のディレクトリのみをリストする-mか、引数なしで現在の月を引数として取得します。
  2. 「--month」の場合、引数として 01 から 12 のみが許可されます
  3. 異なるタスクを実行するために複数のオプションを組み合わせたい、つまりmyScript.py -d this_dir -m 02-d と -m を個別に実行するのとは異なることを行います。
  4. スクリプトにオプションが指定されていない場合にのみ、「オプションが指定されていません!!」と出力されます。

これらは実行可能ですか?私は可能性のある答えを求めて doc.python.org サイトにアクセスしましたが、Python の初心者として、ページで迷子になっていることに気付きました。ご協力いただきありがとうございます。前もって感謝します。乾杯!!


更新: 16/01/11

私はまだ何かが足りないと思います。これが私のスクリプトの内容です。

parser = OptionParser()
usage = "usage: %prog [options] arg1 arg2"

parser.add_option("-m", "--month", type="string",
                  help="select month from  01|02|...|12",
                  dest="mon", default=strftime("%m"))

parser.add_option("-v", "--vo", type="string",
                  help="select one of the supported VOs",
                  dest="vos")

options, arguments = parser.parse_args()

これらは私の目標です:

  1. オプションなしでスクリプトを実行すると、option.mon[ working ]が返されます
  2. -m オプションを指定してスクリプトを実行し、return option.mon[ working ]を指定します
  3. -vオプションのみを指定してスクリプトを実行すると、option.vos[まったく機能しない]のみが返されます
  4. -m および -v オプションを指定してスクリプトを実行すると、別のことが行われます [まだポイントに到達していません]

-m オプションのみを指定してスクリプトを実行すると、option.mon最初に印刷され、次にが印刷されますoption.vosが、これはまったく望ましくありません。誰かが私を正しい方向に向けることができれば、本当に感謝しています。乾杯!!


3回目の更新

    #!/bin/env python

    from time import strftime
    from calendar import month_abbr
    from optparse import OptionParser

    # Set the CL options 
    parser = OptionParser()
    usage = "usage: %prog [options] arg1 arg2"

    parser.add_option("-m", "--month", type="string",
                      help="select month from  01|02|...|12", 
              dest="mon", default=strftime("%m"))

    parser.add_option("-u", "--user", type="string",
                      help="name of the user", 
              dest="vos")

    options, arguments = parser.parse_args()

    abbrMonth = tuple(month_abbr)[int(options.mon)]

    if options.mon:
        print "The month is: %s" % abbrMonth 

    if options.vos:
        print "My name is: %s" % options.vos 

    if options.mon and options.vos:
        print "I'm '%s' and this month is '%s'" % (options.vos,abbrMonth)

これは、さまざまなオプションを指定して実行したときにスクリプトが返すものです。

# ./test.py
The month is: Feb
#
# ./test.py -m 12
The month is: Dec
#
# ./test.py -m 3 -u Mac
The month is: Mar
My name is: Mac
I'm 'Mac' and this month is 'Mar'
#
# ./test.py -u Mac
The month is: Feb
My name is: Mac
I'm 'Mac' and this month is 'Feb'

私は見たいだけです:

 1. `I'm 'Mac' and this month is 'Mar'` - as *result #3*  
 2. `My name is: Mac` - as *result #4*

私は何を間違っていますか?乾杯!!


4 回目の更新:

自問自答: この方法で探しているものを手に入れることができますが、それでも感銘を受けません。

#!/bin/env python

import os, sys
from time import strftime
from calendar import month_abbr
from optparse import OptionParser

def abbrMonth(m):
    mn = tuple(month_abbr)[int(m)]
    return mn

# Set the CL options 
parser = OptionParser()
usage = "usage: %prog [options] arg1 arg2"

parser.add_option("-m", "--month", type="string",
                  help="select month from  01|02|...|12",
                  dest="mon")

parser.add_option("-u", "--user", type="string",
                  help="name of the user",
                  dest="vos")

(options, args) = parser.parse_args()

if options.mon and options.vos:
    thisMonth = abbrMonth(options.mon)
    print "I'm '%s' and this month is '%s'" % (options.vos, thisMonth)
    sys.exit(0)

if not options.mon and not options.vos:
    options.mon = strftime("%m")

if options.mon:
    thisMonth = abbrMonth(options.mon)
    print "The month is: %s" % thisMonth

if options.vos:
    print "My name is: %s" % options.vos

そして今、これはまさに私が探していたものを私に与えます:

# ./test.py 
The month is: Feb

# ./test.py -m 09
The month is: Sep

# ./test.py -u Mac
My name is: Mac

# ./test.py -m 3 -u Mac
I'm 'Mac' and this month is 'Mar'

これがそうする唯一の方法ですか?私には「最善の方法」には見えません。乾杯!!

4

3 に答える 3

3

optparse非推奨です。argparsepython2とpython3の両方で使用する必要があります

http://docs.python.org/library/argparse.html#module-argparse

于 2011-06-02T23:29:11.487 に答える
2

あなたの解決策は私には合理的に見えます。コメント:

  • month_abbrタプルになる理由がわかりません。なしで正常に動作するはずですtuple()
  • 無効な月の値を確認することをお勧めします (raise OptionValueError問題が見つかった場合)
  • ユーザーに正確に "01"、"02"、...、または "12" を入力してもらいたい場合は、"choice" オプション タイプを使用できます。オプション タイプのドキュメントを参照してください
于 2014-05-11T00:32:58.417 に答える