如何生成浏览器
我正在基于 irc.IRCClient 和 pygtk 用 python 开发一个 irc 客户端,我使用了正确的反应器,一切正常。 现在我会在单击 URL 时启动浏览器... 更好的选择是使用 xdg-open,它运行配置的默认浏览器(在免费桌面兼容的 DE 中)。 该 URL 在 gtk 按钮按下事件中选取。 我已经尝试了所有我能想到的可能性,但我的CPU 一直处于100%。 以下是我尝试过的各种方法,仅使用reactor.spawnProcess似乎很有希望,因为在浏览器打开之前一切都很好,当关闭它时CPU会达到100%。所有其他 CPU 很快就会跳到 100% 并保持不变。 直接启动浏览器不会改变任何东西。 我做错了什么?
python 2.6.5 - 扭曲10.1.0 - pygtk 2.16.0
Marco
def on_click(self, b):
.....
.....
if data:
url = self.urls[int(data)]
# 100% cpu forever
browser = utils.getProcessValue('/usr/bin/xdg-open', [url,], os.environ)
browser.addCallback(self.printExitValue)
# 100% cpu after closing browser
xdgProcess = XDGProcessProtocol()
reactor.spawnProcess(xdgProcess, '/usr/bin/xdg-open', ['/usr/bin/xdg-open', url], os.environ )
# 100% cpu forever
os.system('xdg-open %s' % url)
# 100% cpu forever
os.spawnl(os.P_NOWAIT, '/usr/bin/xdg-open', '/usr/bin/xdg-open', url)
# 100% cpu forever
reactor.callInThread(self.browser, url)
return 0
def printExitValue(self, val):
print 'xdg-open %d' % val
def browser(self, url):
os.spawnl(os.P_NOWAIT, '/usr/bin/xdg-open', '/usr/bin/xdg-open', url)
类 XDGProcessProtocol(protocol.ProcessProtocol):
def __init__(self):
self.data = ''
def connectionMade(self):
pass
def outReceived(self, data):
self.data = self.data + data
def errReceived(self, data):
self.data = self.data + data
def inConnectionLost(self):
pass
def outConnectionLost(self):
print self.data
def errConnectionLost(self):
pass
def processExited(self, reason):
print "processExited, status %d" % (reason.value.exitCode,)
def processEnded(self, reason):
print "processEnded, status %d" % (reason.value.exitCode,)
print "quitting"
I'm developing a irc client in python based on irc.IRCClient and pygtk, I'm using the correct reactor and all works fine.
Now I would launch a browser when clicking a Url...
The better choice is to use xdg-open which runs the configured default browser (in a free desktop compliant DE).
The url is picked in a gtk button-press-event.
I have tried all possibilities I can figure out but ever I got the cpu at 100%.
Below are the various ways I tried, only using reactor.spawnProcess seems promising because until the browser is open all is fine, when closing it the cpu goes to 100%. All others the cpu jump at 100% soon and stay.
Launching the browser directly don't change anything.
What I'm doing wrong ?
python 2.6.5 - twisted 10.1.0 - pygtk 2.16.0
Marco
def on_click(self, b):
.....
.....
if data:
url = self.urls[int(data)]
# 100% cpu forever
browser = utils.getProcessValue('/usr/bin/xdg-open', [url,], os.environ)
browser.addCallback(self.printExitValue)
# 100% cpu after closing browser
xdgProcess = XDGProcessProtocol()
reactor.spawnProcess(xdgProcess, '/usr/bin/xdg-open', ['/usr/bin/xdg-open', url], os.environ )
# 100% cpu forever
os.system('xdg-open %s' % url)
# 100% cpu forever
os.spawnl(os.P_NOWAIT, '/usr/bin/xdg-open', '/usr/bin/xdg-open', url)
# 100% cpu forever
reactor.callInThread(self.browser, url)
return 0
def printExitValue(self, val):
print 'xdg-open %d' % val
def browser(self, url):
os.spawnl(os.P_NOWAIT, '/usr/bin/xdg-open', '/usr/bin/xdg-open', url)
class XDGProcessProtocol(protocol.ProcessProtocol):
def __init__(self):
self.data = ''
def connectionMade(self):
pass
def outReceived(self, data):
self.data = self.data + data
def errReceived(self, data):
self.data = self.data + data
def inConnectionLost(self):
pass
def outConnectionLost(self):
print self.data
def errConnectionLost(self):
pass
def processExited(self, reason):
print "processExited, status %d" % (reason.value.exitCode,)
def processEnded(self, reason):
print "processEnded, status %d" % (reason.value.exitCode,)
print "quitting"
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
关闭主题:
这是 pygobject 和 pygtk 中的一个错误,SIGCHLD 处理程序进入无限循环。
中修复
这已在 pygobject-2.21,0 和 pygtk-2.17.0 marco
To close the topic:
it is a bug in both pygobject and pygtk, the SIGCHLD handler enters a endless loop.
This was fixed in pygobject-2.21,0 and pygtk-2.17.0
marco
你可以使用这个:
You can use this:
webbrowser 模块可能是您正在寻找的吗?它是 python 标准库的一部分。
is the webbrowser module perhaps what you're looking for? It's part of python's standard library.
这是一个有效(和失败)的示例。
我调整了您的 irclogbot.py 以在 pygtk 应用程序中运行。
Sys.argv[1] 是 irc 服务器的 url。
在 on_click 方法中更改可执行路径以适合您所拥有的浏览器。
浏览器打开页面关闭页面后,CPU利用率跃升至100%。
马可
Here is a working (and failing) example.
I adapted your irclogbot.py to run in a pygtk app.
Sys.argv[1] is the url of a irc server.
In the method on_click change the executable path to suit a browser you have.
After the browser opened the page close it, the cpu utilization jump to 100%.
Marco