是否有可能在py2exe构建中有一个python shell?

时间:2013-06-04 18:37:14

标签: python py2exe distutils

我通过distutils和py2exe分发Windows软件包。出于开发目的,我希望能够访问py2exe构建中的python控制台。我看到py2exe版本中有一个python27.dll文件,所以我希望我可以利用它来启动一个python终端。

是否可以使用现有的或修改distutils / py2exe来让最终用户访问py2exe环境中的Python shell?

1 个答案:

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