在python中传递命令行arg的实现,不起作用

时间:2012-10-25 08:37:40

标签: python

我对python很新。我希望我可以在python中实现命令行arg作为我的第一个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属性未分配任何值。我在哪里弄错了?

提前致谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

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

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

正如其他人所指出的那样,argparse很不错。