2016-05-05 4 views
2

完全に公開されていますので、私はプログラミングに全く興味がありませんので、事前にお詫び申し上げます。私は、特定のOSコマンド(ping、traceroute、whois)でその入力を使用し、その入力を使用するこのpythonスクリプトに取り組んでいます。完全ではありませんが、スクリプトは次のとおりです。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() 

「選択肢」ごとに2つのエラーが表示されます。

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.のために非常に類似したエラーが間違っているものがある:私は1を入力するのであれば、たとえば私は、プロンプトがドメイン名/ IPアドレスを尋ねると、私はそれを入力したときに、私が手にエラーがあり得ます私はどのように関数を呼び出しているのですか?誰かが正しい方向に私を向けることができますか?私はこのスクリプトの小さな実装(自分の関数を作成することなく)を試みましたが、他に/ elifのステートメントはありません。それはうまくいきます...長いポストと申し訳ありません!

+0

あなたは 'globals()'を使用する必要があります –

答えて

2

現地は現フレームを指し、abが定義されていません。それはあなたがこのようにアクセスすることができますglobals()

内です:

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

説明をいただきありがとうございます。 :) – vladimir

1

あなたが関数内の任意のローカル変数を持っていないので、locals()は、したがって、それはKeyErrorを発生させ、空の辞書です。代わりに、あなたは、単に関数に変数を渡す必要があり(そのことについてまたはglobals()locals()に頼るの

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は必須の辞書であるため、固有の変数名を使用する必要があります。また、2つの関数のローカル変数に固有の名前を付ける必要はありません(たとえば、ping関数とtraceroute関数変数はhostとする必要があります)。

+0

素晴らしい、この解決策も、ありがとう! globals()のようなものよりも好ましい理由はありますか?それは少し速いですか?ちょうど興味があります:) – vladimir

+0

確かに高速ではありません(もしあれば、それは少し遅くなります)。それが好まれる理由は、読みやすく、明確で、間違いを起こしにくいからです。また、 'globals'と' locals'の両方が本質的な辞書であるため、一意の変数名を使用する必要があります。また、2つの関数がローカル変数に対して一意の名前を持つ必要はありません(例えば、pingとtraceroute関数'host'という変数が必要です)。 – DeepSpace

+0

ああ、私はそれを得る!情報人のおかげで、本当に感謝しています。 – vladimir

関連する問題