用Python创建一个服务,在循环中从STDIO读取并写入STDOUT

用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

我需要用Python创建一个服务,这样我可以从Google Chrome扩展发送一个文本,然后这个服务从STDIO读取它,然后做一个小的处理,然后通过STDOUT将它发送回Chrome扩展

我从您在以下URL上的[sample host]获得了以下代码:

我的问题是,这段代码有一个我想删除的窗口(用户界面)

我想这段代码有一个主循环,所以它一直在等待来自GoogleChrome扩展的任何请求

#!/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更改为.pyw

Chrome在一个隐藏窗口(包括控制台应用)中启动您注册的本机主机应用程序,至少在Windows中是这样。为什么不删除所有
Tkinter
代码?我尝试过,但没有成功,我认为这是一切互连,但我需要一个没有任何窗口的代码。我想摆脱它。我想做的是,当从STDIN接收到文本时,文本会被转换,例如:“******”,然后这个转换会被传递回STDOUT。我还需要代码一直在监听进一步的请求。我的意思是,我想要的不仅仅是改变分机。实际上,我运行的代码没有任何扩展。不过,它在GUI窗口中运行得很好。@Aditya Chaurasia只在windows中工作,它不会压制tk GUI。@t.m.adam你说得对,你现在正在寻找同样的东西吗?也许我们可以通过stackoverflow聊天一起调查。我一直在寻找这个,但没有什么真正有用的,所以far@Angel首先,您必须从代码中删除tk部分。然后在python中搜索守护进程。这可能会有帮助: