6

是否有任何现有的 Web 应用程序可以让多个用户同时使用交互式 IDLE 类型的会话?

就像是:

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

(尽管最后一个功能更像是一个额外的功能。)

以另一种方式表述我的问题:我想为 IDLE 创建一个新的前端。我怎样才能做到这一点?

更新:或者我可以通过模拟IDLE eval()

更新2:如果我做了这样的事情怎么办:

  • 我已经设置了一个简单的 GAE Python 聊天应用程序,它允许用户登录、创建聊天室并相互聊天。

  • 除了将传入消息保存到数据存储区之外,我还可以执行以下操作:


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()

这能行吗,还是我要走/这种方法不可行/当我应该使用已经构建的东西时,我正在重复工作?

更新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 工具可以做到这一点?

4

5 回答 5

1

就接口而言,我所知道的最接近您正在寻找的 Python 解释器是DreamPie。它有独立的输入和输出区域,很像聊天界面。此外,DreamPie 在子进程中运行所有代码。DreamPie 还进行补全和语法着色,很像 IDLE,这意味着它不只是通过管道输入和输出到子进程/从子进程输出——它已经实现了您正在寻找的抽象。

如果您希望开发桌面应用程序(而不是 Web 应用程序),我建议您将您的工作基于 DreamPie 并添加多前端功能。

更新:有关语法高亮(包括 HTML),请参阅Pygments项目。但这是一个完全不同的问题。请在这里一次问一个问题。

于 2010-05-29T08:46:23.800 回答
1

我可以在Newow中很快实现类似的东西。显然,访问需要受到相当严格的限制,因为这样做涉及允许某人通过 HTTP 访问 Python 控制台。

我要做的是为控制台创建一个 Athena 小部件,该小部件使用自定义子类code.InteractiveInterpreter的实例,这对所有登录的用户都是通用的。

更新:好的,所以你在 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
于 2010-05-28T20:23:23.030 回答
0

作为概念证明,您可以使用套接字和命令行会话将某些东西放在一起。

于 2010-05-23T23:21:38.020 回答
-1

这很可能在即将使用 0MQ 后端的 IPython 实现中实现。

于 2010-05-23T21:09:25.767 回答
-1

我会使用ipythonscreen。使用此方法,您必须创建一个共享登录,但您都可以连接到共享屏幕会话。一个缺点是你们都会以同一个用户的身份出现。

于 2010-06-01T12:20:02.597 回答