如何从另一个 multiprocessing.Process 访问 pywebview.Window 对象?
How to Access pywebview.Window Object from Another multiprocessing.Process?
我有一个 webview
控制 flask
api。
Web 视图将有一个启动 flask server
的按钮和一个停止服务器的按钮。这就是为什么我必须使用 multiprocessing.Process
为 Flask
创建一个单独的进程。这样,我就不能再访问我的 pywebview.Window
了。我想在 Flask
过程中使用 pywebview.Window
评估一些 javascript 和 pywebview.Window.evaluate_js()
(当然它必须与我之前创建的 pywebview.Window
相同为 Flask
打开一个新进程)。
有谁知道如何解决这个问题。我很感激!
一些示例代码:
from flask import Flask, request, jsonify
import os, sys, re, json, socket, sqlite3, base64, requests, webview
from flask_cors import CORS
class ServerFlaskApi:
def __init__(self):
self.app = Flask(__name__, root_path=Root_Dir)
self.app.add_url_rule("/", view_func=self.Default)
def Default(self):
return "Welcome to the Python Http Server for your Application!", 200
def PrintToWebViewConsole(self):
#Trying to use pywebview.Window here, of course WebviewWindow is not defined!!!
WebviewWindow.evaluate_js(js_script)
################
class WebviewApi:
def __init__(self):
self.server_thread = None
def StartServer(self):
self.server_thread = multiprocessing.Process(target=Run_Flask_Server, daemon=True)
self.server_thread.start()
def StopServer(self):
self.server_thread.terminate()
def Run_Flask_Server():
serverApi = ServerFlaskApi()
CORS(serverApi.app)
serverApi.app.run(host=Server_Host, port=Server_Port, debug=True, use_reloader=False)
################
if __name__ == "__main__":
WebViewApi = WebviewApi()
WebviewWindow = webview.create_window(title="Server Monitor", url="view/main-gui.html", js_api=WebViewApi, width=550, height=750, min_size=(550, 750), resizable=False, on_top=True, confirm_close=False)
webview.start(debug=False)
我在 Python
还是新人,所以欢迎任何建议!
提前致谢!
我想我必须使用 Threading
而不是 Processing
,因为 Thread
是共享内存而 Process
不是。
另外,对于任何想要停止 Thread
的人来说,这里有一个函数可以做到这一点,不确定这是否是一个好方法,但它对我有用:
def Kill_Thread(thread):
if not isinstance(thread, threading.Thread):
raise TypeError("Must be set as threading.Thread type!!!")
thread_id = thread.ident
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, ctypes.py_object(SystemExit))
if res > 1:
ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, 0)
print("Exception raise failure")
我有一个 webview
控制 flask
api。
Web 视图将有一个启动 flask server
的按钮和一个停止服务器的按钮。这就是为什么我必须使用 multiprocessing.Process
为 Flask
创建一个单独的进程。这样,我就不能再访问我的 pywebview.Window
了。我想在 Flask
过程中使用 pywebview.Window
评估一些 javascript 和 pywebview.Window.evaluate_js()
(当然它必须与我之前创建的 pywebview.Window
相同为 Flask
打开一个新进程)。
有谁知道如何解决这个问题。我很感激!
一些示例代码:
from flask import Flask, request, jsonify
import os, sys, re, json, socket, sqlite3, base64, requests, webview
from flask_cors import CORS
class ServerFlaskApi:
def __init__(self):
self.app = Flask(__name__, root_path=Root_Dir)
self.app.add_url_rule("/", view_func=self.Default)
def Default(self):
return "Welcome to the Python Http Server for your Application!", 200
def PrintToWebViewConsole(self):
#Trying to use pywebview.Window here, of course WebviewWindow is not defined!!!
WebviewWindow.evaluate_js(js_script)
################
class WebviewApi:
def __init__(self):
self.server_thread = None
def StartServer(self):
self.server_thread = multiprocessing.Process(target=Run_Flask_Server, daemon=True)
self.server_thread.start()
def StopServer(self):
self.server_thread.terminate()
def Run_Flask_Server():
serverApi = ServerFlaskApi()
CORS(serverApi.app)
serverApi.app.run(host=Server_Host, port=Server_Port, debug=True, use_reloader=False)
################
if __name__ == "__main__":
WebViewApi = WebviewApi()
WebviewWindow = webview.create_window(title="Server Monitor", url="view/main-gui.html", js_api=WebViewApi, width=550, height=750, min_size=(550, 750), resizable=False, on_top=True, confirm_close=False)
webview.start(debug=False)
我在 Python
还是新人,所以欢迎任何建议!
提前致谢!
我想我必须使用 Threading
而不是 Processing
,因为 Thread
是共享内存而 Process
不是。
另外,对于任何想要停止 Thread
的人来说,这里有一个函数可以做到这一点,不确定这是否是一个好方法,但它对我有用:
def Kill_Thread(thread):
if not isinstance(thread, threading.Thread):
raise TypeError("Must be set as threading.Thread type!!!")
thread_id = thread.ident
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, ctypes.py_object(SystemExit))
if res > 1:
ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, 0)
print("Exception raise failure")