2008-12-26 63 views
4


我想在我的一個應用程序中包含Python腳本,這是用Python自己編寫的。Python應用程序中的腳本

我的應用程序必須能夠調用外部Python函數(由用戶編寫)爲回調。代碼執行必須有一些控制權;例如,如果用戶提供了帶有語法錯誤的代碼,則應用程序必須發出該信號。

這樣做的最好方法是什麼?
謝謝。

編輯:問題不清楚。我需要一種類似於VBA事件的機制,其中有一個「聲明」部分(您定義全局變量)和事件,以腳本代碼的形式在特定點觸發。

+0

出於興趣,它是什麼樣的應用程序? – 2008-12-26 18:17:22

+0

我正在開發一個可擴展/可腳本化的日誌分析工具(在讀取日誌文件時執行操作)。 原理是:「企業中的每個應用程序都有自己的日誌文件格式,因此給用戶靈活定義自己的監控規則」。 – 2008-12-26 19:00:02

回答

8

使用__import__來導入用戶提供的文件。該功能將返回一個模塊。用它來調用導入文件中的函數。

使用try..except都在__import__和在實際的調用捕捉錯誤。

例子:

m = None 
try: 
    m = __import__("external_module") 
except: 
    # invalid module - show error 
if m: 
    try: 
     m.user_defined_func() 
    except: 
     # some error - display it 
4

RestrictedPython爲Python提供了一個受限制的執行環境,例如,用於運行不受信任的代碼。

7

如果您想用戶交互輸入命令,我可以強烈推薦code模塊,標準庫的一部分。 InteractiveConsole和InteractiveInterpreter對象允許用戶輸入的簡單輸入和評估,並且錯誤處理非常好,可以使用回溯來幫助用戶正確使用。

只要確保趕上SystemExit!

$ python 
Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> shared_var = "Set in main console" 
>>> import code 
>>> ic = code.InteractiveConsole({ 'shared_var': shared_var }) 
>>> try: 
...  ic.interact("My custom console banner!") 
... except SystemExit, e: 
...  print "Got SystemExit!" 
... 
My custom console banner! 
>>> shared_var 
'Set in main console' 
>>> shared_var = "Set in sub-console" 
>>> sys.exit() 
Got SystemExit! 
>>> shared_var 
'Set in main console' 
0

「我的應用程序必須能夠調用外部Python函數(由用戶編寫)作爲回調函數」。

還有一種方法通常比較簡單。

定義在特定點調用方法函數的類。您提供了一個默認實現。

然後,您的用戶可以擴展這些類並提供適當的方法功能而不是回調。

這很少需要全局變量。實現起來也比較簡單,因爲你的用戶可以做類似以下的事情:

import core_classes 
class MyExtension(core_classes.SomeClass): 
    def event_1(self, args): 
     # override the default behavior for event_1. 

core_classes.main(MyExtension) 

這個工作非常順利,並且允許最大的靈活性。由於他們的代碼是「主」模塊,所以錯誤總是存在於他們的代碼中。

相關問題