2013-06-04 75 views
0

我通过distutils和py2exe为Windows发布了一个软件包。为了开发目的,我希望能够访问py2exe内部的python控制台。我看到在py2exe版本中有一个python27.dll文件,所以我希望我可以利用它来启动一个python终端。是否有可能在py2exe版本中有一个python shell?

是否有可能采取现有的或修改distutils/py2exe来获取最终用户访问py2exe环境中的Python shell?

+0

是...看看pycrust –

+0

pycrust取决于wxWindows的,如果你不是已经在使用它可以是一个非首发。 wxWindows在最近的OSX上也有一些问题。因人而异! – synthesizerpatel

回答

0

从pymntos谷歌小组的Matt Anderson记录的结果来看,有一种非常简单的方法来实现这一点。我已经看到它的一些变化,但是当我用Google搜索时,这个变化首先出现了。 :p

果汁是在stdlib code模块中,利用code.InteractiveInterpeter。你唯一需要做的就是在应用程序启动时将其作为线程添加进来。然后,当应用程序启动时,您可以telnet'localhost 7777',您应该放入Python解释器。

尽管做为一个线程的问题 - 你不能很容易地在主线程中调用变量/数据,而不需要做某种排队和传递东西。

你也可以有一个异步套接字 - 这样你就可以把东西作为一个主线程参与者。由于许多原因,这本质上是危险的。但是,我们正在谈论裸机。

如果使用Twisted库,则可以使用Twisted Conch,它允许您创建可与应用程序其余部分通信的SSH或Telnet服务器。然而,这可能是一个问题,因为你使用UI中的事件循环来处理事件 - 你不能有两个事件循环。如果你使用的是Qt,那么就有一个Twisted Qt Reactor事件循环。如果是窗户或其他东西..我不知道。但是,这至少应该让你考虑一些事情。

原文链接:https://groups.google.com/forum/?fromgroups#!topic/pymntos/-Mjviu7R2bs

import socket 
import code 
import sys 

class MyConsole(code.InteractiveConsole): 
    def __init__(self, rfile, wfile, locals=None): 
     self.rfile = rfile 
     self.wfile = wfile 
     code.InteractiveConsole.__init__(
      self, locals=locals, filename='<MyConsole>') 

    def raw_input(self, prompt=''): 
     self.wfile.write(prompt) 
     return self.rfile.readline().rstrip() 

    def write(self, data): 
     self.wfile.write(data) 


netloc = ('', 7777) 
servsock = socket.socket() 
servsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) 
servsock.bind(netloc) 
servsock.listen(5) 
print 'listening' 
sock, _ = servsock.accept() 
print 'accepted' 

rfile = sock.makefile('r', 0) 
sys.stdout = wfile = sock.makefile('w', 0) 

console = MyConsole(rfile, wfile) 
console.interact() 
相关问题