Аз съм много нов за Python. Иска ми се да мога да изпълня командния ред arg преминавайки в 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
атрибут не получава никаква стойност. Къде съм направил грешката?
Благодаря предварително.
Отговори:
2 за отговор № 1Argparse наистина е много по-прост начин за решаване на подобни проблеми
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
2 за отговор № 2
Забравихте знака за равенство след "папка", трябва да бъде getopt.getopt(argv, "hbf:", ["help", "bucket=", "folder="])
, нали?
Отстъпът ви е неправилен и трябва да доведе до синтактична грешка. Трябва да бъде:
elif opt in ("-f", "--folder"):
s3.foldername = arg
Както други посочиха, argparse хубаво е.