Как вызвать локальную программу на Python через собственное приложение Chrome для обмена сообщениями?
Я пытаюсь вызвать программу "test.py", которая является локальным файлом на моем жестком диске, через программу "native-application", которая связывается с моим приложением chrome. Однако приложение Chrome не запускает "test.py", когда я пытаюсь запустить приложение через Google Chrome. Однако выполнение моей программы из собственного приложения через командную строку вызывает "test.py" и работает как положено. Как я могу заставить мою программу "родного приложения" вызывать локальную программу на моем жестком диске через приложение chrome?
Родная прикладная программа
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()
1 ответ
Если вы хотите, чтобы ваше приложение chrome получало доступ к локальным файлам в вашей системе, вы должны указать полный путь к вашей программе.
execfile("test.py")
должен иметь полный путь
execfile("C:\\users\\abc\\test.py")