2010-06-11 33 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

相关问题