2017-03-21 20 views
0
def runtest(testname): 
     usrdef_sship = sship_e.get() 
     usrdef_username = username_e.get() 
     usrdef_pass = pass_e.get() 
     testresult = cpdiag.testname(cpdiag.ssh(usrdef_sship, usrdef_username, usrdef_pass)) 
     messagebox.showinfo("Results", testresult) 

    #Button for disk Test 
    disktest = Button(top, text="Disk Test", command = lambda: runtest("diskTest") 
    disktest.grid(row=3,column=0, sticky=W) 
    #Button for cpwd Test 
    cpwdtest = Button(top, text="CPWD Test", command = lambda: runtest("cpwdTest") 
    cpwdtest.grid(row=4,column=0, sticky=W) 

必要なコードを縮小しようとしました。完全なコードはhttps://github.com/elta13/cpdiagです。上記のコードは、私はしばらくの間、私の頭を叩いています。私はかなりPythonには新しく、この間、必要に応じて最初のプロジェクトを学んでいます。Python:ローカル文字列変数を使用してリモート関数を呼び出す

私はTkinterを使用して、usrdef変数を取得するための3つの入力フィールドを表示しています。それから私はいくつかのボタンを使用しています、それぞれは別のローカルファイルcpdiag.pyから関数を呼び出します。今、私はcpdiagの行である唯一のものを呼び出すリモート関数ごとに関数を書き直しています。 "testname"(cpdaig.ssh "etc")

現在の問題: runtuestのボタンruntest(diskTest)で、これは "function diskTest at x0xxxxx"と表示されます。コードは、他のローカルファイルcpdiag.pyに存在しない "cpdiag.testname"を呼び出そうとするとクラッシュします。

それで、私はruntest( "diskTest")を渡すことができ、runtest()の内部に印刷することが分かりました。しかし、runtestはまだ他のファイルから "cpdiag.testname"を呼び出そうとします。現時点では、私はローカル変数を使ってリモートから何かを呼び出す方法を理解していません。

だから私はruntest( "cpdiag.diskTest")を渡そうとしましたが、 "str 'は呼び出すことができませんでした。

runtest()に "testname"を渡すにはどうしたらいいですか? "testname"は他のファイルcpdiag.pyで定義されている関数です。

+0

私は20回もそのようなトップの答えを読んだと思いますが、私はこの例では「バー」が何であるかを理解していないと思います。 –

+0

barはfooの関数名です。あなたの例では、 'testresult = getattr(cpdiag、testname)(cpdiag.ssh(usrdef_sship、usrdef_username、usrdef_pass))' –

+0

になります。私はどのようにまだ理解できませんが、すぐに十分です!私のシナリオを少し説明してくれてありがとう! –

答えて

0

getattr組み込み関数を使用して、オブジェクトcpdiagで呼び出すメソッドのインスタンスを取得し、メソッドを呼び出すことができます。

your_function = getattr(cpdiag, testname) # Get the method first 
# Now invoke 
your_function(cpdiag.ssh(usrdef_sship, usrdef_username, usrdef_pass))