2010-06-11 35 views
2

我有一個用python編寫的應用程序。我想讓我的用戶能夠通過允許他們運行自己的腳本來操作應用程序對象。他們可能會在腳本中發生錯誤。如果出現錯誤,我想確保應用程序不會停止運行。我想在我的應用中嵌入一個調試器來幫助他們調試腳本。Python作爲Python應用程序中的最終用戶腳本

例如我在我的應用程序在shapes.py定義一個點類:

class QVPoint(object): 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 
    def addPoint(self, aPoint): 
     self.x = self.x + aPoint.x 
     self.y = self.y + aPoint.y 

我想使他們能夠運行像腳本:

from shapes import QVPoint 
a = QVPoint(1,1) 
a.addPoint(QVPoint(2,2)) 
print "<" + str(a.x) + ',' + str(a.y) + ">" 
print "<%d,%d>" % (a.x, a.y) 
print 'done' 

我想這必須使用的解釋器,調試器,但我m不確定兩個計數,1)如何將App中創建的對象展示給腳本,以及2)如何確保如果錯誤導致腳本停止,應用程序不會停止。

我確定這個問題以前一定要問過,但我找不到。歡迎所有的答案。

許多THX

大衛

+0

請格式化您的代碼。 – alternative 2010-06-11 18:00:04

+0

只是爲了澄清我想與腳本分享應用程序的狀態。一個子流程將涉及設計一個協議來傳達應用程序狀態變化,並且會非常緩慢。在一個單獨的線程上可能需要的唯一東西就是一個調試器 - 儘管我可能能夠使用遠程調試器。 – DangerMouse 2010-06-17 10:15:24

+0

我想我的解決方案是使用compile()和eval()封裝try:except。使用稱爲沙箱的空白模塊的全局變量。 – DangerMouse 2010-06-17 11:26:41

回答

3

我會建議你使用一個單獨的解釋器實例(獨立的Python進程)來評估用戶的腳本。這將保證用戶腳本中的任何中斷不會影響您的應用程序。您可以使用os模塊運行外部進程,這可以這樣做:http://docs.python.org/library/os.html#os.popen

您可以允許用戶的腳本從應用程序中導入某些模塊,以便您定義的變量可由腳本訪問。

+0

只需注意''subprocess'建議通過'os'啓動外部進程。 – 2010-06-11 18:39:36

+0

真的,對不起,子過程是一個更好的選擇。 – 2010-06-12 05:57:02

1

有幾個決定。

  1. 您是否想要在應用程序的相同過程中或在單獨的過程中運行它?

    不知道你的應用程序的很多細節,我傾向於傾向於在單獨的過程中運行它們。爲此,請使用subprocess模塊。您可以創建一個應用程序啓動器,然後調用您的用戶腳本。如果它拋出一個異常,你可以捕獲它並格式化結果並報告給用戶。

  2. 是否要將類或用戶的類暴露給用戶?

    在你的例子中,似乎共享類已經足夠了。這應該相當簡單。

    如果只有類,您可以簡單地將它包含在PYTHONPATH中。然後你的用戶可以導入它們。如果你想暴露一個對象,它可能需要你在做這件事。否則,你必須找到一種方法來序列化你的對象並將其轉移到新的過程中。

+0

只是爲了澄清,我期待分享對象以及課堂。如果我使用子進程,那麼我需要創建代理和存根以在兩個進程之間進行通信 - 這似乎比應該需要的更多的工作。這也意味着任何想擴展應用程序的人都需要編寫代理和存根,這絕對是不可取的。 – DangerMouse 2010-06-17 10:11:14

相關問題