gpt4 book ai didi

python - 如何在一个 python 脚本中控制/调用另一个 python 脚本? (脚本之间的通信)

转载 作者:行者123 更新时间:2023-11-28 21:30:13 24 4
gpt4 key购买 nike

我正在开发一个 GUI 程序,打算在一个事件中添加一个长时间运行的任务,但我发现这会使整个程序卡住很多,所以考虑到其他人的建议,我会让 GUI 只负责启动、停止和监视,并使长时间运行的任务作为单独的脚本运行。我知道在一个脚本中运行另一个脚本的唯一方法是通过导入,是否有任何其他方法可以与另一个脚本通信,我的意思是例如读取另一个脚本的标准输出并随时终止它?

最佳答案

我建议你看看 threading module .通过子类化 Thread 类,您可以为时间密集型作业创建新线程。

然后对于线程之间的通信,您可以使用 pubsubpydispatcher ,我还没有尝试过后者,所以我不能对它发表评论,但我会推荐 pubsub,因为它易于使用,而且它与 wxpython 的区别是一个额外的好处。

Here 是一个关于运行长任务的 wxpython wiki 页面,如果你想要最简单的线程使用示例,请跳到最后。


这是一个简单的(可运行的)示例,说明如何使用 pubsub 将消息从 workerThread 发送到 GUI

import time

import wx
from threading import Thread
from wx.lib.pubsub import Publisher

class WorkerThread(Thread):
def __init__(self):
Thread.__init__(self)

#A flag that can be set
#to tell the thread to end
self.stop_flag = False

#This calls the run() to start the new thread
self.start()


def run(self):
""" Over-rides the super-classes run()"""
#Put everything in here that
#you want to run in your new thread

#e.g...
for x in range(20):
if self.stop_flag:
break
time.sleep(1)
#Broadcast a message to who ever's listening
Publisher.sendMessage("your_topic_name", x)
Publisher.sendMessage("your_topic_name", "finished")


def stop(self):
"""
Call this method to tell the thread to stop
"""
self.stop_flag = True




class GUI(wx.Frame):
def __init__(self, parent, id=-1,title=""):
wx.Frame.__init__(self, parent, id, title, size=(140,180))
self.SetMinSize((140,180))
panel = wx.Panel(id=wx.ID_ANY, name=u'mainPanel', parent=self)

#Subscribe to messages from the workerThread
Publisher().subscribe(self.your_message_handler, "your_topic_name")

#A button to start the workerThread
self.startButton = wx.Button(panel, wx.ID_ANY, 'Start thread')
self.Bind(wx.EVT_BUTTON, self.onStart, self.startButton)

#A button to stop the workerThread
self.stopButton = wx.Button(panel, wx.ID_ANY, 'Stop thread')
self.Bind(wx.EVT_BUTTON, self.onStop, self.stopButton)

#A text control to display messages from the worker thread
self.threadMessage = wx.TextCtrl(panel, wx.ID_ANY, '', size=(75, 20))

#Do the layout
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.startButton, 0, wx.ALL, 10)
sizer.Add(self.stopButton, 0, wx.ALL, 10)
sizer.Add(self.threadMessage, 0, wx.ALL, 10)
panel.SetSizerAndFit(sizer)


def onStart(self, event):
#Start the worker thread
self.worker = WorkerThread()

#Disable any widgets which could affect your thread
self.startButton.Disable()

def onStop(self, message):
self.worker.stop()

def your_message_handler(self, message):
message_data = message.data
if message_data == 'finished':
self.startButton.Enable()
self.threadMessage.SetLabel(str(message_data))
else:
self.threadMessage.SetLabel(str(message_data))

if __name__ == "__main__":

app = wx.PySimpleApp()
frame = GUI(None, wx.ID_ANY, 'Threading Example')
frame.Show()
app.MainLoop()

关于python - 如何在一个 python 脚本中控制/调用另一个 python 脚本? (脚本之间的通信),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3482112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com