2013-06-04 77 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() 
相關問題