Python 如果在线程内运行,urllib2 opener将挂起

Python 如果在线程内运行,urllib2 opener将挂起,python,pygtk,urllib2,Python,Pygtk,Urllib2,我有一个运行良好的代码(连接到页面,获取PHPSESSID)。 当我将代码放入函数中,然后创建一个线程: Gdk.threads_enter() threading.Thread(target=self.do_login,args=()).start() Gdk.threads_leave() 代码挂起 f=opener.open(请求) 你知道为什么吗 当我强制关闭应用程序时,它会完成所有操作,并在终端中无错误地打印所有内容。为什么它只挂在线程中的特定行上。它不在线程之外。好的,我只是在这里

我有一个运行良好的代码(连接到页面,获取PHPSESSID)。 当我将代码放入函数中,然后创建一个线程:

Gdk.threads_enter()
threading.Thread(target=self.do_login,args=()).start()
Gdk.threads_leave()
代码挂起

f=opener.open(请求)

你知道为什么吗


当我强制关闭应用程序时,它会完成所有操作,并在终端中无错误地打印所有内容。为什么它只挂在线程中的特定行上。它不在线程之外。

好的,我只是在这里转发评论,这样问题就可以解决了

正如在其他关于
pygtk
threading
的帖子中提到的,一些看似奇怪的挂起行为似乎与未实现以下行有关:

gobject.threads_init()

在调用gtk主循环之前。但是请注意,在stackoverflow的其他问题中,有报道称此解决方案可能适用于Windows,也可能不适用于Windows

你怎么知道它挂在
opener.open(req)
?打印“got here”。。。然后重新运行代码。但当我按下关闭按钮时,一切都完成了。我发现如果我在thread.start()上运行thread.run(),一切都会正常工作。但是.run()函数在处理请求时仍然冻结我的GUI,因此您可以看到
print“before open()”;sys.stdout.flush()
,但不在“之后打印”。对吗?在这里输入/输出线程时,您想要实现什么?如果
self.do\u login()
直接触摸GUI,那么您应该将线程移入/移出GUI。如何在启动时初始化线程,如何调用gtk_main?您能提供一个再现您的问题的最小完整示例吗?如果没有最小的代码,很难看出您的问题是什么,但在我看来(我自己也有类似的问题,线程无故挂起,与urllib2无关),添加
gobject.threads_init()
在启动gtk main之前,可以解决python gtk应用程序的许多线程问题。@deinonychusaur哇!成功了!!!