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

您忘记了“文件夹”后面的等号,应该是getopt.getopt(argv, "hbf:", ["help", "bucket=", "folder="]),对吧?

您的缩进不正确,应该会导致语法错误。它应该是:

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

正如其他人指出的那样,argparse很好。

于 2012-10-25T08:50:29.093 回答
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 回答