完全公开,我完全是编程新手,所以我提前道歉。我正在编写这个python脚本,它将获取用户输入,并在某些操作系统命令(ping、traceroute、whois)中使用该输入。它并不完整,但下面是脚本:
#!/usr/bin/python
from os import system
def pingz():
system('ping -c 5 %(ab)s' % locals())
def trace_route():
system('traceroute %(cd)s' % locals())
print("My Web Utility:")
print("____________________\n")
print(" 1)Ping a website/IP Address.\n")
print(" 2)Trace the route to a website/IP Address.\n")
print(" 3)Whois inforation.\n")
choice = raw_input("What would you like to do? \n")
if choice == '1':
ab = raw_input("Please enter the Domain Name/IP Address:\n")
pingz()
elif choice == '2':
cd = raw_input("Please enter the Domain Name/IP Address:\n")
trace_route() 我在每个“选项”上都得到了两个错误。例如,如果我键入1,我会得到一个要求输入域名/ip地址的提示,当我输入域名/ip地址时,我得到的错误是:
Traceback (most recent call last):
File "./test2.py", line 19, in <module>
pingz()
File "./test2.py", line 6, in pingz
system('ping -c 5 %(ab)s' % locals())
KeyError: 'ab'选择2也有类似的错误,是不是我调用函数的方式有问题?有谁能告诉我怎么走吗?我已经尝试了这个脚本的较小的实现(没有创建我自己的函数),没有else/elif语句,它工作得很好……很抱歉发了这么长的帖子,提前谢谢!
发布于 2016-05-05 14:48:54
局部变量指的是当前帧,当前帧中没有定义ab。它就在你的globals()里
您可以这样访问它:
def pingz():
system('ping -c 5 %(ab)s' % globals())发布于 2016-05-05 14:50:34
函数内部没有任何局部变量,因此locals()是一个空字典,因此它会引发一个KeyError。
您应该简单地将变量传递给函数,而不是依赖locals() (或globals() ):
def pingz(host):
system('ping -c 5 %s' % host)
.
.
.
ab = raw_input("Please enter the Domain Name/IP Address:\n")
pingz(ab)与使用locals()或globals()相比,该方法更可取。它更易读,更清晰,更不容易出错,特别是当你计划在函数中修改可变对象的时候。
此外,由于globals和locals本质上都是字典,它们强制您使用唯一的变量名称,并且没有理由让两个函数的本地变量具有唯一的名称(例如,您的ping和traceroute函数都应该有一个名为host的变量)。
https://stackoverflow.com/questions/37044092
复制相似问题