在Python应用中作为终端用户脚本的Python

2 投票
2 回答
702 浏览
提问于 2025-04-15 23:51

我有一个用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'

我想这应该使用解释器和调试器,但我不太确定两个问题,1)如何让应用中创建的对象可以在脚本中使用,2)如何确保如果脚本出错,应用程序不会停止。

我相信这个问题之前一定有人问过,但我找不到相关信息。欢迎所有的回答。

非常感谢

大卫

2 个回答

1

这里有几个决定需要做。

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

    在不了解你应用程序的具体情况之前,我倾向于选择在一个单独的进程中运行。可以使用 subprocess 模块来实现这个。你可以创建一个应用启动器,它会调用用户的脚本。如果脚本出现错误,你可以捕获这个错误,格式化结果,然后反馈给用户。

  2. 你想把类暴露给用户,还是把对象暴露给用户?

    在你的例子中,似乎分享类就足够了。这应该比较简单。

    如果只是类,你可以直接把它放在 PYTHONPATH 中。这样用户就可以直接导入它们。如果你想暴露一个对象,可能就需要在进程中进行处理。否则,你得找到一种方法,把对象序列化,然后传输到新的进程中。

3

我建议你使用一个单独的解释器实例(也就是一个单独的Python进程)来运行用户的脚本。这样可以确保用户脚本中出现的问题不会影响到你的应用程序。你可以使用os模块来运行外部进程,这是一种实现方法:http://docs.python.org/library/os.html#os.popen

你可以允许用户的脚本导入你应用中的某些模块,这样你定义的变量就可以在这些脚本中使用。

撰写回答