Python: Сетевой БЕЗДЕЙСТВУЮТ/ВОССТАНАВЛИВАЮТ НЕАКТИВНЫЙ фронтенд при использовании того же бэкенда?

Есть ли какое-либо существующее веб-приложение, которое позволяет многочисленным пользователям работать с интерактивной НЕАКТИВНОЙ сессией типа сразу?

Что-то как:

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, чтобы сделать это?

6
задан HostileFork 8 June 2010 в 23:26
поделиться

5 ответов

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

0
ответ дан 18 December 2019 в 04:49
поделиться

это, вероятно, возможно с предстоящим внедрением IPython с использованием бэкэнда 0MQ.

-1
ответ дан 18 December 2019 в 04:49
поделиться

Я могу довольно быстро реализовать нечто подобное в 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
1
ответ дан 18 December 2019 в 04:49
поделиться

Я бы использовал ipython и screen . С помощью этого метода вам нужно будет создать общий логин, но вы оба можете подключиться к сеансу с общим экраном. Одним из недостатков будет то, что вы оба будете отображаться как один и тот же пользователь.

-1
ответ дан 18 December 2019 в 04:49
поделиться

Самый близкий интерпретатор Python, который я знаю, к тому, что вы ищете, с точки зрения интерфейса, это DreamPie. В нем есть отдельные области ввода и вывода, что очень похоже на интерфейс чата. Кроме того, DreamPie выполняет весь код в подпроцессе. DreamPie также выполняет завершение и раскрашивание синтаксиса, подобно IDLE, что означает, что он не просто передает ввод и вывод в/из подпроцесса - в нем реализованы абстракции, которые вы ищете.

Если вы хотите разработать настольное приложение (не веб-приложение), я рекомендую основывать свою работу на DreamPie и просто добавить функциональность нескольких фронтендов.

Обновление: Для подсветки синтаксиса (включая HTML) смотрите проект Pygments. Но это совершенно другой вопрос; пожалуйста, задавайте по одному вопросу здесь.

1
ответ дан 18 December 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: