Есть ли какое-либо существующее веб-приложение, которое позволяет многочисленным пользователям работать с интерактивной НЕАКТИВНОЙ сессией типа сразу?
Что-то как:
IDLE 2.6.4
Morgan: >>> letters = list("abcdefg")
Morgan: >>> # now, how would you iterate over letters?
Jack: >>> for char in letters:
print "char %s" % char
char a
char b
char c
char d
char e
char f
char g
Morgan: >>> # nice nice
В противном случае я хотел бы создать тот. Есть ли некоторый модуль, который я могу использовать, который моделирует интерактивную сессию? Я хотел бы интерфейс как это:
def class InteractiveSession():
''' An interactive Python session '''
def putLine(line):
''' Evaluates line '''
pass
def outputLines():
''' A list of all lines that have been output by the session '''
pass
def currentVars():
''' A dictionary of currently defined variables and their values '''
pass
(Хотя та последняя функция была бы большим количеством дополнительной функции.)
Сформулировать мою проблему иначе: я хотел бы создать новый фронтэнд для НЕАКТИВНОГО. Как я могу сделать это?
ОБНОВЛЕНИЕ: Или возможно я могу моделировать НЕАКТИВНЫЙ через eval()
?
ОБНОВЛЕНИЕ 2: Что, если я сделал что-то вроде этого:
У меня уже есть простое настроенное приложение чата Python GAE, который позволяет пользователям регистрироваться, делать чат-комнаты и чат друг с другом.
Вместо того, чтобы просто сохранить входящие сообщения к хранилищу данных, я мог сделать что-то вроде этого:
def putLine(line, user, chat_room):
''' Evaluates line for the session used by chat_room '''
# get the interactive session for this chat room
curr_vars = InteractiveSession.objects.where("chatRoom = %s" % chat_room).get()
result = eval(prepared_line, curr_vars.state, {})
curr_vars.state = curr_globals
curr_vars.lines.append((user, line))
if result:
curr_vars.lines.append(('SELF', result.__str__()))
curr_vars.put()
Модель InteractiveSession:
def class InteractiveSession(db.Model):
# a dictionary mapping variables to values
# it looks like GAE doesn't actually have a dictionary field, so what would be best to use here?
state = db.DictionaryProperty()
# a transcript of the session
#
# a list of tuples of the form (user, line_entered)
#
# looks something like:
#
# [('Morgan', '# hello'),
# ('Jack', 'x = []'),
# ('Morgan', 'x.append(1)'),
# ('Jack', 'x'),
# ('SELF', '[1]')]
lines = db.ListProperty()
Это могло работать или является мной, путем от/этот подхода является infeasible/I'm, копирующий работу, когда я должен использовать что-то уже созданное?
ОБНОВЛЕНИЕ 3: Кроме того, принятие меня получает все остальное работа, я хотел бы подсветку синтаксиса. Идеально, у меня были бы некоторый API или сервис, который я мог использовать, который проанализирует код и разработает его соответственно.
for c in "characters":
стал бы:
<span class="keyword">for</span> <span class="var">c</span> <span class="keyword">in</span> <span class="string>"characters"</span><span class="punctuation">:</span>
Существует ли хороший существующий инструмент Python, чтобы сделать это?
В качестве доказательства концепции вы можете указать что-то вместе, используя сокеты и сеанс командной строки.
это, вероятно, возможно с предстоящим внедрением IPython с использованием бэкэнда 0MQ.
Я могу довольно быстро реализовать нечто подобное в Nevow. Очевидно, что доступ должен быть довольно ограниченным, поскольку для этого нужно предоставить кому-то доступ к консоли Python через HTTP.
Я бы создал виджет Athena для консоли, который использовал бы экземпляр пользовательского подкласса code.InteractiveInterpreter, общего для всех вошедших пользователей.
UPDATE: Итак, в GAE есть что-то похожее на чат. Если вы просто отправляете строки в подкласс code.InteractiveInterpreter, который выглядит следующим образом, он должен работать для вас. Обратите внимание, что интерфейс довольно похож на описанный вами класс InteractiveSession:
class SharedConsole(code.InteractiveInterpreter):
def __init__(self):
self.users = []
def write(self, data):
# broadcast output to connected clients here
for user in self.users:
user.addOutput(data)
class ConnectedUser(object):
def __init__(self, sharedConsole):
self.sharedConsole = sharedConsole
sharedConsole.users.append(self) # reference look, should use weak refs
def addOutput(self, data):
pass # do GAE magic to send data to connected client
# this is a hook for submitted code lines; call it from GAE when a user submits code
def gotCommand(self, command):
needsMore = self.sharedConsole.runsource(command)
if needsMore:
pass # tell the client to change the command line to a textarea
# or otherwise add more lines of code to complete the statement
Я бы использовал ipython и screen . С помощью этого метода вам нужно будет создать общий логин, но вы оба можете подключиться к сеансу с общим экраном. Одним из недостатков будет то, что вы оба будете отображаться как один и тот же пользователь.
Самый близкий интерпретатор Python, который я знаю, к тому, что вы ищете, с точки зрения интерфейса, это DreamPie. В нем есть отдельные области ввода и вывода, что очень похоже на интерфейс чата. Кроме того, DreamPie выполняет весь код в подпроцессе. DreamPie также выполняет завершение и раскрашивание синтаксиса, подобно IDLE, что означает, что он не просто передает ввод и вывод в/из подпроцесса - в нем реализованы абстракции, которые вы ищете.
Если вы хотите разработать настольное приложение (не веб-приложение), я рекомендую основывать свою работу на DreamPie и просто добавить функциональность нескольких фронтендов.
Обновление: Для подсветки синтаксиса (включая HTML) смотрите проект Pygments. Но это совершенно другой вопрос; пожалуйста, задавайте по одному вопросу здесь.