从 Thread 创建的子进程中获取进程 ID
Get process id from subprocess created by Thread
我有一个使用 GUI 的简单 python 应用程序。在那个 GUI 上我有一个“开始”按钮:
gui.py
self.button_start = tk.Button(master=self.frame_button_start, text="Start",
command=self.controler.start(target=Writer.start_server()), width=20)
如您所见,它从我的自定义 class Controler
.
调用函数 start(self, target=None)
Controler
是管理 Thread
创建的 class,start
函数如下所示:
#controler.py
def start(self, target):
self.current_thread = Thread(target=target, daemon=True)
self.current_thread_list.append(self.current_thread)
sikuli_process_id = self.current_thread
使用开始按钮,它创建一个 Thread
来执行一个启动 subprocess
:
的函数
# writer.py
def start_server():
dirpath = os.getcwd()
rootpath = dirpath[:-6]
sikulixjar = rootpath + 'sikulix\sikulix.jar'
group_file = rootpath + 'sikulix\groups.txt'
now = time.strftime('%Y%m%d%H%M%S')
logfilename = now + '-server.log'
userlog = rootpath + 'Writer\Logs\User\' + logfilename
logfile = rootpath + 'Writer\Logs\System\' + logfilename
"""Start the server in an asynch subprocess by executing the java command that execute sikuli"""
javacommand = 'java -jar {} -d 2 -f {} -u {} -g {} -s'.format(sikulixjar, logfile, userlog, group_file)
print("### STARTING SERVER ###")
server = subprocess.Popen(javacommand, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
shell=True, universal_newlines=True)
Controler.Controler.output_manager()
return server.pid
我现在在问自己是否有可能将 server.pid
恢复为 gui.py
,我不知道如何从 return 中获取值 start_server()
线程。
我的项目是这样的:
-root - classes - controler.py
| | gui.py
|
- functions - writer.py
您可以使用 Queue
(https://docs.python.org/3/library/queue.html) 在线程之间传递值
因此,将队列传递给您的守护线程,将 pid 放入队列并在您的主线程中检索它。
我有一个使用 GUI 的简单 python 应用程序。在那个 GUI 上我有一个“开始”按钮:
gui.py
self.button_start = tk.Button(master=self.frame_button_start, text="Start",
command=self.controler.start(target=Writer.start_server()), width=20)
如您所见,它从我的自定义 class Controler
.
start(self, target=None)
Controler
是管理 Thread
创建的 class,start
函数如下所示:
#controler.py
def start(self, target):
self.current_thread = Thread(target=target, daemon=True)
self.current_thread_list.append(self.current_thread)
sikuli_process_id = self.current_thread
使用开始按钮,它创建一个 Thread
来执行一个启动 subprocess
:
# writer.py
def start_server():
dirpath = os.getcwd()
rootpath = dirpath[:-6]
sikulixjar = rootpath + 'sikulix\sikulix.jar'
group_file = rootpath + 'sikulix\groups.txt'
now = time.strftime('%Y%m%d%H%M%S')
logfilename = now + '-server.log'
userlog = rootpath + 'Writer\Logs\User\' + logfilename
logfile = rootpath + 'Writer\Logs\System\' + logfilename
"""Start the server in an asynch subprocess by executing the java command that execute sikuli"""
javacommand = 'java -jar {} -d 2 -f {} -u {} -g {} -s'.format(sikulixjar, logfile, userlog, group_file)
print("### STARTING SERVER ###")
server = subprocess.Popen(javacommand, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
shell=True, universal_newlines=True)
Controler.Controler.output_manager()
return server.pid
我现在在问自己是否有可能将 server.pid
恢复为 gui.py
,我不知道如何从 return 中获取值 start_server()
线程。
我的项目是这样的:
-root - classes - controler.py
| | gui.py
|
- functions - writer.py
您可以使用 Queue
(https://docs.python.org/3/library/queue.html) 在线程之间传递值
因此,将队列传递给您的守护线程,将 pid 放入队列并在您的主线程中检索它。