0

I'm trying to invoke the program "test.py" which is a local file on my hard disk through my "native-application" program which communicates with my chrome app. However the chrome app doesn't run "test.py" when I try running the app through google chrome. However executing my native-application program through command line invokes "test.py" and works as expected. How can I make my "native application" program invoke the local python program on my hard disk through the chrome app?

Native Application Program

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()
  • Does "doesn't run" mean literally that you get no errors or any other output at all, and the program simply doesn't run? – Bryan Oakley Mar 29 '15 at 23:44
  • I'm not exactly sure what happens. But I put a flag after `execfile("test.py"` to see if it gets set. Running the native application through the command line sets the flag. But when I run it though the chrome app, the flag doesn't get set. – Karthik Bhalla Mar 30 '15 at 01:33
  • Can a chrome app actually access a local python program? – Prasanth Louis Mar 30 '15 at 06:01

1 Answers1

0

If you want your chrome app to access local files on your system, you have to specify the whole path to your program.

execfile("test.py") 

should have the complete path

execfile("C:\\users\\abc\\test.py")
Prasanth Louis
  • 4,658
  • 2
  • 34
  • 47