我通过distutils和py2exe分发Windows软件包。出于开发目的,我希望能够访问py2exe构建中的python控制台。我看到py2exe版本中有一个python27.dll
文件,所以我希望我可以利用它来启动一个python终端。
是否可以使用现有的或修改distutils / py2exe来让最终用户访问py2exe环境中的Python shell?
答案 0 :(得分:0)
正如pymntos google小组的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()