在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'
我想这应该使用解释器和调试器,但我不太确定两个问题,1)如何让应用中创建的对象可以在脚本中使用,2)如何确保如果脚本出错,应用程序不会停止。
我相信这个问题之前一定有人问过,但我找不到相关信息。欢迎所有的回答。
非常感谢
大卫
2 个回答
1
这里有几个决定需要做。
你想在你的应用程序的同一个进程中运行它,还是在一个单独的进程中运行?
在不了解你应用程序的具体情况之前,我倾向于选择在一个单独的进程中运行。可以使用
subprocess
模块来实现这个。你可以创建一个应用启动器,它会调用用户的脚本。如果脚本出现错误,你可以捕获这个错误,格式化结果,然后反馈给用户。你想把类暴露给用户,还是把对象暴露给用户?
在你的例子中,似乎分享类就足够了。这应该比较简单。
如果只是类,你可以直接把它放在 PYTHONPATH 中。这样用户就可以直接导入它们。如果你想暴露一个对象,可能就需要在进程中进行处理。否则,你得找到一种方法,把对象序列化,然后传输到新的进程中。
3
我建议你使用一个单独的解释器实例(也就是一个单独的Python进程)来运行用户的脚本。这样可以确保用户脚本中出现的问题不会影响到你的应用程序。你可以使用os模块来运行外部进程,这是一种实现方法:http://docs.python.org/library/os.html#os.popen
你可以允许用户的脚本导入你应用中的某些模块,这样你定义的变量就可以在这些脚本中使用。