如何通过本地消息铬应用程序调用本地python程序



我正试图通过与chrome应用程序通信的"本机应用程序"程序调用程序"test.py",这是我硬盘上的一个本地文件。然而,当我尝试通过谷歌chrome运行chrome应用程序时,该应用程序不会运行"test.py"。然而,通过命令行执行本机应用程序会调用"test.py"并按预期工作。如何通过chrome应用程序使我的"本机应用程序"程序调用硬盘上的本地python程序?

本机应用程序

import struct
import sys
import threading
import Queue
from urllib2 import urlopen
import subprocess
import thread
import time
import io
import base64
import urllib
from tkFileDialog import askopenfile, asksaveasfile
#from test import main
msg="hello"
flag=1
try:
  import Tkinter
  import tkMessageBox
except ImportError:
  Tkinter = None
# On Windows, the default I/O mode is O_TEXT. Set this to O_BINARY
# to avoid unwanted modifications of the input/output streams.
if sys.platform == "win32":
  import os, msvcrt
  msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
  msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
def print_time():
    print 'hi'
    execfile("test.py")
    print 'test done'
    global flag 
    flag=0


    #print('done')
# Helper function that sends a message to the webapp.
def quitxy():
    message1='hello'
    #sys.stdout.write(struct.pack('I', len(message1)))
    #sys.stdout.write(message1)
    #sys.stdout.flush()
    #print('hi')
    threadx = threading.Thread(target=print_time, args=())
    threadx.start()
    #thready = threading.Thread(target=main,args=())
    #thready.start()




def send_message(message):
   # Write message size.
  sys.stdout.write(struct.pack('I', len(message)))
  # Write the message itself.
  sys.stdout.write(message)
  sys.stdout.flush()

# Thread that reads messages from the webapp.
def read_thread_func(queue):
  message_number = 0
  while 1:
    # Read the message length (first 4 bytes).
    text_length_bytes = sys.stdin.read(4)
    if len(text_length_bytes) == 0:
      if queue:
        queue.put(None)
      sys.exit(0)
    # Unpack message length as 4 byte integer.
    text_length = struct.unpack('i', text_length_bytes)[0]
    # Read the text (JSON object) of the message.
    text = sys.stdin.read(text_length).decode('utf-8')
    if queue:
      queue.put(text)
    else:
      # In headless mode just send an echo message back.
      send_message('{"echo": %s}' % 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.quiqw)
      self.sendButton.grid(row=1, column=1, padx=10, pady=10)
      self.quitButton = Tkinter.Button(self, text="Quit",command=quitxy)
      self.quitButton.grid(row=1, column=2, 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)
        #main_window.quit()
        #mssg=""
        #msg=message
    #self.log("Received %s" % message)
    f = asksaveasfile(mode='w', defaultextension=".txt", initialfile="maple123.txt", initialdir="C:UsersPrasanthDesktop")
    if not f:
        return
    f.write(message)
    f.close()




      self.after(100, self.processMessages)

    def quiqw(self):
      text = '{"text": "' + self.messageContent.get() + '"}'
      self.log('Sending %s' % text)
      global flag
      if(flag==0):
        self.log("DONE FLAG")

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

如果你想让chrome应用程序访问系统上的本地文件,你必须指定程序的整个路径。

execfile("test.py") 

应该有完整的路径

execfile("C:\users\abc\test.py")

相关内容

  • 没有找到相关文章

最新更新