用Python创建一个服务,在循环中从STDIO读取并写入STDOUT
我需要用Python创建一个服务,这样我可以从Google Chrome扩展发送一个文本,然后这个服务从STDIO读取它,然后做一个小的处理,然后通过STDOUT将它发送回Chrome扩展 我从您在以下URL上的[sample host]获得了以下代码: 我的问题是,这段代码有一个我想删除的窗口(用户界面) 我想这段代码有一个主循环,所以它一直在等待来自GoogleChrome扩展的任何请求用Python创建一个服务,在循环中从STDIO读取并写入STDOUT,python,python-2.7,google-chrome,google-chrome-extension,python-requests,Python,Python 2.7,Google Chrome,Google Chrome Extension,Python Requests,我需要用Python创建一个服务,这样我可以从Google Chrome扩展发送一个文本,然后这个服务从STDIO读取它,然后做一个小的处理,然后通过STDOUT将它发送回Chrome扩展 我从您在以下URL上的[sample host]获得了以下代码: 我的问题是,这段代码有一个我想删除的窗口(用户界面) 我想这段代码有一个主循环,所以它一直在等待来自GoogleChrome扩展的任何请求 #!/usr/bin/env python import struct import sys imp
#!/usr/bin/env python
import struct
import sys
import threading
import Queue
try:
import Tkinter
import tkMessageBox
except ImportError:
Tkinter = None
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
def send_message(message):
sys.stdout.write(struct.pack('I', len(message)))
sys.stdout.write(message)
sys.stdout.flush()
def read_thread_func(queue):
while 1:
text_length_bytes = sys.stdin.read(4)
if len(text_length_bytes) == 0:
if queue:
queue.put(None)
sys.exit(0)
text_length = struct.unpack('i', text_length_bytes)[0]
text = sys.stdin.read(text_length).decode('utf-8')
if queue:
queue.put(text)
if Tkinter:
class NativeMessagingWindow(Tkinter.Frame):
def __init__(self, queue):
self.queue = queue
Tkinter.Frame.__init__(self)
self.pack()
self.text = Tkinter.Text(self)
self.text.grid(row=0, column=0, padx=10, pady=10, columnspan=2)
self.text.config(state=Tkinter.DISABLED, height=10, width=40)
self.messageContent = Tkinter.StringVar()
self.sendEntry = Tkinter.Entry(self, textvariable=self.messageContent)
self.sendEntry.grid(row=1, column=0, padx=10, pady=10)
self.sendButton = Tkinter.Button(self, text="Send", command=self.onSend)
self.sendButton.grid(row=1, column=1, padx=10, pady=10)
self.after(100, self.processMessages)
def processMessages(self):
while not self.queue.empty():
message = self.queue.get_nowait()
if message == None:
self.quit()
return
self.log("Received %s" % message)
self.after(100, self.processMessages)
def onSend(self):
text = '{"text": "' + self.messageContent.get() + '"}'
self.log('Sending %s' % text)
try:
send_message(text)
except IOError:
tkMessageBox.showinfo('Native Messaging Example',
'Failed to send message.')
sys.exit(1)
def log(self, message):
self.text.config(state=Tkinter.NORMAL)
self.text.insert(Tkinter.END, message + "\n")
self.text.config(state=Tkinter.DISABLED)
def Main():
if not Tkinter:
send_message('"Tkinter python module wasn\'t found. Running in headless ' +
'mode. Please consider installing Tkinter."')
read_thread_func(None)
sys.exit(0)
queue = Queue.Queue()
main_window = NativeMessagingWindow(queue)
main_window.master.title('Native Messaging Example')
thread = threading.Thread(target=read_thread_func, args=(queue,))
thread.daemon = True
thread.start()
main_window.mainloop()
sys.exit(0)
if __name__ == '__main__':
Main()
您知道如何删除GUI并使程序等待外部请求吗?如果我正确解释了您的问题,您希望程序继续运行,但不显示控制台窗口。要做到这一点,只需将文件扩展名从.py更改为.pywChrome在一个隐藏窗口(包括控制台应用)中启动您注册的本机主机应用程序,至少在Windows中是这样。为什么不删除所有
Tkinter
代码?我尝试过,但没有成功,我认为这是一切互连,但我需要一个没有任何窗口的代码。我想摆脱它。我想做的是,当从STDIN接收到文本时,文本会被转换,例如:“******”,然后这个转换会被传递回STDOUT。我还需要代码一直在监听进一步的请求。我的意思是,我想要的不仅仅是改变分机。实际上,我运行的代码没有任何扩展。不过,它在GUI窗口中运行得很好。@Aditya Chaurasia只在windows中工作,它不会压制tk GUI。@t.m.adam你说得对,你现在正在寻找同样的东西吗?也许我们可以通过stackoverflow聊天一起调查。我一直在寻找这个,但没有什么真正有用的,所以far@Angel首先,您必须从代码中删除tk部分。然后在python中搜索守护进程。这可能会有帮助: