2016-05-05 37 views
2

完全公開,我對編程完全陌生,所以我提前致歉。我正在研究這個python腳本,它將獲取用戶輸入並在某些操作系統命令(ping,traceroute,whois)中使用該輸入。這是不完整的,但這裏是腳本:python腳本錯誤(編程非常新!)

#!/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 I得到一個提示,詢問的域名/ 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非常類似的錯誤有什麼問題我如何調用函數?任何人都可以指出我正確的方向嗎?我已經嘗試過這個腳本的小實現(沒有創建自己的函數),沒有其他的/ elif語句,並且它工作正常...很抱歉,很長的文章,並提前感謝!

+0

你需要使用'globals()' –

回答

2

當地人指的是當前幀,其中沒有定義ab。這是你的globals()內,

您可以像這樣訪問:

def pingz(): 
    system('ping -c 5 %(ab)s' % globals()) 
+0

非常感謝你的解釋,絕對解決了這個問題! :) – vladimir

1

你不具備的功能內的任何局部變量,所以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()是優選的。 它更易讀,更清晰,不易出錯,特別是如果您打算修改函數內的可變對象。

而且,因爲這兩個globalslocals是essentialy字典,他們強迫你使用唯一的變量名,也沒有理由2層的功能應該有自己的局部變量唯一的名稱(例如,無論你ping和traceroute功能應該有一個變量叫做host)。

+0

真棒,這個解決方案也工作,謝謝!有什麼理由比globals()更適合嗎?它快一點嗎?只是好奇:) – vladimir

+0

它肯定不會更快(如果有的話,它會慢一點)。它最好的原因是它更可讀,更清晰,不易出錯。另外,由於'globals'和'locals'都是本質性的字典,它們強制你使用唯一的變量名,並且沒有理由說2個函數應該爲它們的局部變量指定唯一的名字(例如,你的ping和traceroute函數應該有一個名爲'host'的變量)。 – DeepSpace

+0

哦,我明白了!感謝信息人,我非常感謝。 – vladimir