我对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
属性未分配任何值。我在哪里弄错了?
提前致谢。
答案 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很不错。