0

我正在尝试通过与我的 chrome 应用程序通信的“本机应用程序”程序调用程序“test.py”,它是我硬盘上的本地文件。但是,当我尝试通过 google 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:\Users\Prasanth\Desktop")
    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()
4

1 回答 1

0

如果您希望 chrome 应用程序访问系统上的本地文件,则必须指定程序的整个路径。

execfile("test.py") 

应该有完整的路径

execfile("C:\\users\\abc\\test.py")
于 2015-03-30T11:42:15.213 回答