2010-06-11 2 views
2

У меня есть приложение, написанное на питоне. Я хочу, чтобы мои пользователи могли манипулировать объектами приложений, позволяя им запускать свои собственные скрипты. Они, вероятно, будут делать ошибки в своих сценариях. Если есть ошибка, я хочу убедиться, что приложение не перестает работать. Я хотел бы встроить отладчик в свое приложение, чтобы помочь им отлаживать свои скрипты.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' 

Я полагаю, что это должно использовать интерпретатор, отладчик, но я m не уверен по двум причинам: 1) как выставить объекты, созданные в приложении, в сценарий, и 2) как обеспечить, чтобы приложение не останавливалось, если ошибка заставила сценарий остановиться.

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

Многих ТНХИ

Дэвид

+0

Отформатируйте код, пожалуйста. – alternative

+0

Просто, чтобы уточнить, я хочу поделиться с приложением сценария. Подпроцесс будет включать в себя разработку протокола для передачи изменений состояния приложения и будет очень медленным. Единственное, что может понадобиться в отдельном потоке, - это иногда отладчик, хотя я мог бы использовать удаленный отладчик. – DangerMouse

+0

Я думаю, что моим решением будет использование compile() и eval(), завернутых try: except. используя глобалы пустого модуля, называемого песочница. – DangerMouse

ответ

3

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

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

+0

Просто обратите внимание, что 'subprocess' рекомендуется для' os' для запуска внешних процессов. –

+0

Правда, извините за это, подпроцесс - лучший выбор. –

1

Существует несколько решений, которые необходимо принять.

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

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

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

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

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

+0

Чтобы уточнить, я хочу поделиться объектами, а также классами. Если я использую подпроцесс, тогда мне нужно будет создать прокси и заглушки для связи между этими двумя процессами - что кажется больше работы, чем нужно. Это также означает, что любой, кто хочет расширить приложение, должен писать прокси и заглушки, что определенно нежелательно. – DangerMouse