Python线程和子进程
所以我在线程方面遇到了问题。我已经包括了一个类似于我在我的程序中遇到的例子。当我运行以下代码时,它只会在按下菜单中的“退出”按钮后打印“hello”。它似乎挂在subprocess.call()上。我不明白出了什么问题 另外,我没有Python线程方面的经验,而且我对整个语言都是新手,所以请随意对我的结构缺陷以及Python编程约定大喊大叫!) 谢谢Python线程和子进程,python,multithreading,gtk,Python,Multithreading,Gtk,所以我在线程方面遇到了问题。我已经包括了一个类似于我在我的程序中遇到的例子。当我运行以下代码时,它只会在按下菜单中的“退出”按钮后打印“hello”。它似乎挂在subprocess.call()上。我不明白出了什么问题 另外,我没有Python线程方面的经验,而且我对整个语言都是新手,所以请随意对我的结构缺陷以及Python编程约定大喊大叫!) 谢谢 import threading import subprocess import gtk class TestDaemon: def
import threading
import subprocess
import gtk
class TestDaemon:
def __init__(self):
# start thread here
cmdman = CommandManager()
threading.Thread(target=cmdman.run, args=('CmdThread', 1)).start()
self.icon = gtk.StatusIcon()
self.icon.set_from_stock(gtk.STOCK_ABOUT)
self.icon.set_visible(True)
self.menu = gtk.Menu()
self.menu_item = gtk.ImageMenuItem(gtk.STOCK_QUIT)
self.menu_item.connect('activate', self.quit_app, self.menu)
self.menu.append(self.menu_item)
self.icon.connect('popup-menu', self.popup_menu, self.menu)
self.icon.set_visible(True)
gtk.main()
def quit_app(self, widget, data = None):
gtk.main_quit()
def popup_menu(self, widget, button, time, data = None):
if button == 3 and data:
data.show_all()
data.popup(None, None, gtk.status_icon_position_menu,
3, time, self.icon)
class CommandManager:
def __init__(self):
pass
def run(self, *args):
subprocess.call('echo "hello"', shell=True)
if __name__ == '__main__':
TestDaemon()
编辑:
我忘了提到,如果我在subprocess.call()之前添加一个sys.stdout.write(),sys.stdout.write()将运行,但subprocess.call()将不会运行。您应该使用
gtk.mainloop()
而不是gtk.main()
,那么它应该可以工作
这里的问题是gtk.main()
阻塞并不让其他线程运行,它可能不会释放GIL。(最初作为注释发布):
退出前加入线程:
class TestDaemon:
def __init__(self):
# start thread here
cmdman = CommandManager()
self.cmdThread = threading.Thread(target=cmdman.run, args=('CmdThread', 1))
self.cmdThread.daemon = True
self.cmdThread.start()
...
def quit_app(self, widget, data = None):
self.cmdThread.join()
gtk.main_quit()
将线程设置为守护进程适用于主线程引发某些异常而未调用join()的情况。谢谢您的建议,但它不起作用…:(还有其他想法吗?到底什么不起作用?如果我运行(并将该调用移出课堂,因为它不应该属于课堂),它会按预期运行。无论出于何种原因,它似乎每隔一段时间就运行一次,但其他时间,它不会……(也就是说,如果我连续运行一段时间,它会按预期运行。)已解决。感谢您的帮助!:)(解决方案是加入线程。)请尝试在正在生成的线程上设置daemon=True,或者在退出之前加入它。非常好,谢谢!!我只需要加入它!:)介意我这样回答吗#名誉与卖淫