Python как скрипт конечного пользователя в приложении Python - PullRequest
2 голосов
/ 11 июня 2010

У меня есть приложение, написанное на 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) как убедиться, что приложение не останавливается, если ошибка приводит к остановке сценария.

Я уверен, что это должно быть задано раньше, но я не могу его найти.Все ответы приветствуются.

Многие, спасибо

Дэвид

Ответы [ 2 ]

3 голосов
/ 11 июня 2010

Я бы предложил вам использовать отдельный экземпляр интерпретатора (отдельный процесс Python) для оценки пользовательских сценариев. Это гарантирует, что любые перерывы в пользовательском скрипте никогда не повлияют на ваше приложение. Вы можете запускать внешние процессы с помощью модуля os, это может быть одним из способов сделать это: http://docs.python.org/library/os.html#os.popen

Вы можете разрешить пользовательским сценариям импортировать определенные модули из вашего приложения, чтобы указанные вами переменные были доступны сценариям.

1 голос
/ 11 июня 2010

Необходимо принять несколько решений.

  1. Хотите запустить его в том же процессе вашего приложения или в отдельном процессе?

    Не зная подробностей вашего приложения, я бы предпочел запустить их в отдельном процессе. Для этого используйте модуль subprocess. Вы можете создать панель запуска приложений, которая в свою очередь вызывает скрипт вашего пользователя. Если оно выдает исключение, вы можете перехватить его, отформатировать результат и сообщить пользователю.

  2. Хотите ли вы предоставить классы своему пользователю или объекты своему пользователю?

    В вашем примере кажется, что совместного использования классов достаточно. Это должно быть довольно просто.

    Если это только классы, вы можете просто включить его в PYTHONPATH. Тогда ваш пользователь может просто импортировать их. Если вы хотите выставить объект, это может потребовать от вас сделать это в процессе. В противном случае вам нужно найти способ сериализации ваших объектов и перенести их в новый процесс.

...