1

私はPythonを初めて使用します。最初のPythonスクリプトとしてPythonで渡すコマンドライン引数を実装できればいいのにと思います。私はこのコードを書きました:

def main(argv):
    try:
        opts, args = getopt.getopt(argv, "hb:b:f", ["help", "bucket=", "folder"])
    except getopt.GetoptError:
        usage()
        sys.exit(2)
    s3 = get_files()
    for opt, arg in opts:
        if opt in ("-h", "--help"):
            usage()
            sys.exit()
        elif opt in ("-b", "--bucket"):
            s3.bucketname = arg
        elif opt in ("-f", "--folder"):
            s3.foldername = arg
            print("Came here" + s3.foldername)
    s3.download_files()

コマンドからの-f引数では、私が問題に直面しているところです。デバッグには、printステートメントを使用しました。私は次のような引数を渡します:

./hello -b something -f /path

しかし悲しいことにそれは印刷されます:

Came here

ただし、foldername属性には値が割り当てられていません。どこで間違いを犯しているのですか?

前もって感謝します。

4

2 に答える 2

2

Argparseは、実際には、このような問題を解決するためのはるかに簡単な方法です。

import argparse

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('-b', '--bucket', dest='bucketname', action='store')
    parser.add_argument('-f', '--folder', dest='folder', action='store')
    args = parser.parse_args('-b foo'.split())
    print args
    args = parser.parse_args('-b foo -f /foo'.split())
    print args

与える:

> Namespace(bucketname='foo', folder=None)
> Namespace(bucketname='foo', folder='/foo')

つまり、関数を次のように書き直すことができます。

import sys
import argparse

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-b', '--bucket', dest='bucketname', action='store')
    parser.add_argument('-f', '--folder', dest='folder', action='store')
    args = parser.parse_args()
    s3 = get_files()
    s3.foldername = args.folder
    s3.download_files()

それ以上の作業がなければ、の出力script.py --helpは次のようになります。

usage: script.py [-h] [-b BUCKETNAME] [-f FOLDER]

optional arguments:
  -h, --help            show this help message and exit
  -b BUCKETNAME, --bucket BUCKETNAME
  -f FOLDER, --folder FOLDE
于 2012-10-25T08:48:54.360 に答える
2

「フォルダ」の後の等号を忘れてしまいましたgetopt.getopt(argv, "hbf:", ["help", "bucket=", "folder="])ね。

インデントが正しくないため、構文エラーが発生するはずです。そのはず:

elif opt in ("-f", "--folder"):
    s3.foldername = arg

他の人が指摘しているように、argparseは素晴らしいです。

于 2012-10-25T08:50:29.093 に答える