2

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

例如,我在我的应用程序中的 shape.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)如何将在应用程序中创建的对象公开给脚本,以及 2)如何确保应用程序不会停止如果一个错误导致脚本停止。

我敢肯定这之前一定有人问过,但我找不到。欢迎所有答案。

很多谢谢

大卫

4

2 回答 2

3

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

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

于 2010-06-11T18:03:48.700 回答
1

有几个决定要做。

  1. 您想在应用程序的同一进程中还是在单独的进程中运行它?

    在不了解您的应用程序的很多细节的情况下,我倾向于在单独的进程中运行它们。为此使用该subprocess模块。您可以创建一个应用程序启动器,然后调用您的用户脚本。如果它引发异常,您可以捕获它并格式化结果并报告给用户。

  2. 您想将类公开给您的用户还是将对象公开给您的用户?

    在您的示例中,似乎共享课程就足够了。这应该相当简单。

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

于 2010-06-11T18:23:26.993 回答