我想在我的一個應用程序中包含Python腳本,這是用Python自己編寫的。Python應用程序中的腳本
我的應用程序必須能夠調用外部Python函數(由用戶編寫)爲回調。代碼執行必須有一些控制權;例如,如果用戶提供了帶有語法錯誤的代碼,則應用程序必須發出該信號。
這樣做的最好方法是什麼?
謝謝。
編輯:問題不清楚。我需要一種類似於VBA事件的機制,其中有一個「聲明」部分(您定義全局變量)和事件,以腳本代碼的形式在特定點觸發。
我想在我的一個應用程序中包含Python腳本,這是用Python自己編寫的。Python應用程序中的腳本
我的應用程序必須能夠調用外部Python函數(由用戶編寫)爲回調。代碼執行必須有一些控制權;例如,如果用戶提供了帶有語法錯誤的代碼,則應用程序必須發出該信號。
這樣做的最好方法是什麼?
謝謝。
編輯:問題不清楚。我需要一種類似於VBA事件的機制,其中有一個「聲明」部分(您定義全局變量)和事件,以腳本代碼的形式在特定點觸發。
使用__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
RestrictedPython爲Python提供了一個受限制的執行環境,例如,用於運行不受信任的代碼。
如果您想用戶交互輸入命令,我可以強烈推薦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'
「我的應用程序必須能夠調用外部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)
這個工作非常順利,並且允許最大的靈活性。由於他們的代碼是「主」模塊,所以錯誤總是存在於他們的代碼中。
出於興趣,它是什麼樣的應用程序? – 2008-12-26 18:17:22
我正在開發一個可擴展/可腳本化的日誌分析工具(在讀取日誌文件時執行操作)。 原理是:「企業中的每個應用程序都有自己的日誌文件格式,因此給用戶靈活定義自己的監控規則」。 – 2008-12-26 19:00:02