Python作为python应用程序中的最终用户脚本

时间:2010-06-11 17:52:39

标签: python extensibility

我有一个用python编写的应用程序。我想让我的用户能够通过允许他们运行自己的脚本来操纵app对象。他们可能会在脚本中出错。如果有错误,我想确保应用程序不会停止运行。我想在我的应用程序中嵌入一个调试器,以帮助他们调试脚本。

e.g。我在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'

我认为这必须使用解释器,调试器,但我不确定两个方面,1)如何将在App中创建的对象暴露给脚本,以及2)如何确保应用程序没有如果错误导致脚本停止,则停止。

我确信之前一定要问过,但我找不到它。欢迎所有答案。

很多thx

大卫

2 个答案:

答案 0 :(得分:3)

我建议你使用一个单独的解释器实例(单独的python进程)来评估用户的脚本。这将保证用户脚本中的任何中断都不会影响您的应用程序。您可以使用os模块运行外部进程,这是一种方法:http://docs.python.org/library/os.html#os.popen

您可以允许用户的脚本从您的应用程序导入某些模块,以便脚本可以访问您定义的变量。

答案 1 :(得分:1)

要做出一些决定。

  1. 您想在应用程序的同一过程中或在单独的过程中运行它吗?

    如果不了解您应用的详细信息,我倾向于支持在单独的流程中运行它们。为此,请使用subprocess模块。您可以创建一个应用程序启动器,然后再调用您的用户脚本。如果它抛出异常,您可以捕获它并格式化结果并向用户报告。

  2. 是否要将类公开给用户或向用户公开对象?

    在您的示例中,似乎共享类就足够了。这应该很简单。

    如果它只是类,您可以简单地将它包含在PYTHONPATH中。然后您的用户可以导入它们。如果要公开对象,可能需要在此过程中执行此操作。或者你必须找到一种方法来序列化你的对象并将其转移到新的过程。