让Python在继续之前确认If/Elif/Else
我编写了一个简单的python脚本,用于获取命令行参数并将它们写入一个文件,以便使用Ansible部署到路由器。但在脚本创建输出文件之前,我想强制用户使用Y/N(Yes或No)条目确认请求 如何修改此脚本以在每个if/elif语句之后请求该脚本让Python在继续之前确认If/Elif/Else,python,if-statement,Python,If Statement,我编写了一个简单的python脚本,用于获取命令行参数并将它们写入一个文件,以便使用Ansible部署到路由器。但在脚本创建输出文件之前,我想强制用户使用Y/N(Yes或No)条目确认请求 如何修改此脚本以在每个if/elif语句之后请求该脚本 #!/usr/bin/python import argparse import sys parser = argparse.ArgumentParser() parser.add_argument("-s", "--set", help="set"
#!/usr/bin/python
import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument("-s", "--set", help="set", action="store_true")
parser.add_argument("-d", "--delete", help="delete", action="store_true")
parser.add_argument("-i", "--ipaddr", help="Target IP")
args = parser.parse_args()
if args.set:
print "Deploying: set routing-options static route %s" % (args.ipaddr)
filename = open("/var/tmp/output.txt",'w')
sys.stdout = filename
print "set routing-options static route %s" % (args.ipaddr)
elif args.delete:
print "Deploying: delete routing-options static route %s" % (args.ipaddr)
filename = open("/var/tmp/output.txt",'w')
sys.stdout = filename
print "delete routing-options static route %s" % (args.ipaddr)
else:
exit(1)
只需编写一个
ask\u confirm
函数,并在需要时调用它:
def ask_confirm(msg="Are you sure?"):
answer = ""
while answer not in ("yes", "no"):
answer = input(msg + " [yes/no]")
return (True if answer == "yes" else False)
msg
的默认值允许您使用一般消息调用ask\u confirm
。
它返回一个布尔值,因此更易于处理。
如果需要的话,可以用更奇特的方式定制输入。
以下是一个更为奇特的版本:
def ask_confirm(msg="Are you sure?", yes=None, no=None):
if yes is None:
yes = ["yes"]
if no is None:
no = ["no"]
if isinstance(yes, str):
yes = [yes]
if isinstance(no, str):
no = [no]
answer = ""
while answer not in yes and answer not in no:
answer = input(msg + " [{}/{}]".format(yes[0], no[0]))
return (True if answer in yes else False)
然后,您可以在每个区块的开头要求确认:
if args.set:
if not ask_confirm("Do you really want to set?"):
sys.exit()
# else (not needed)
# proceed
elif args.delete:
if not ask_confirm("Are you sure you want to delete?"):
sys.exit()
# else (not needed)
# proceed
else:
sys.exit(1)
我尝试了一次,但它似乎陷入了一个循环,从未继续。我必须控制住它。[]$./test.py-s-i 10.0.0.1是否确实要设置?[是/否]是,您真的要设置吗?[是/否]^CTraceback(最近一次调用):文件“/test.py”,在if not ask_confirm(“您真的想设置吗?”)中的第29行:文件“/test.py”,在ask_confirm answer=input(msg+”[{}/{}]”中的第24行。格式(是[0],否[0]))KeyboardInterrupt@Alby,嗯,我刚试过,效果如预期。您到底是如何尝试的?我使用了非花式选项并得到了以下错误:[]$./test.py-s-i10.0.0.1是否确实要设置?[是/否]是回溯(最后一次调用):文件“/test.py”,第36行,在if not ask_confirm(“您真的想设置吗?”):文件“/test.py”,第15行,在ask_confirm answer=input(msg+“[yes/no]”文件),第1行,在NameError中:名称“是”未定义不确定是否重要,但我使用的是Python 2.7。5@Alby你能尝试添加
print(答案)吗;打印(回答是);在ask\u confirm
方法中的answer=input(…)
之后立即打印(回答否)
?