是否有任何现有的网络应用可以让多个用户同时使用交互式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创建一个新的前端。我怎么能这样做?
更新:或者我可以通过eval()
来模拟IDLE?
更新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工具来做到这一点?
答案 0 :(得分:1)
我可以在Nevow中快速实现类似的功能。显然,访问需要非常有限,因为做这样的事情涉及允许通过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
答案 1 :(得分:1)
就接口而言,我所知道的最接近的Python解释器是DreamPie。它有独立的输入和输出区域,就像聊天界面一样。此外,DreamPie运行子进程中的所有代码。 DreamPie也完成和语法着色,就像IDLE一样,这意味着它不仅仅管道输入和输出到子进程 - 它已经实现了你正在寻找的抽象。
如果您希望开发桌面应用程序(不是网络应用程序),我建议您将工作基于DreamPie,只需添加多个前端功能。
更新:有关语法突出显示(包括HTML),请参阅Pygments项目。但这是一个完全不同的问题;请在这里一次提出一个问题。
答案 2 :(得分:0)
作为概念证明,您可以使用套接字和命令行会话将某些内容放在一起。
答案 3 :(得分:-1)
这可能是使用0MQ后端即将实现的Python。
答案 4 :(得分:-1)