python webbrowser.open(url)

1 投票
3 回答
5732 浏览
提问于 2025-04-15 21:34
httpd = make_server('', 80, server)
webbrowser.open(url)
httpd.serve_forever()

这个在不同的平台上都能用,除了在用putty的ssh终端时。
我该怎么做才能让控制台在一个单独的进程中打开w3m浏览器,这样它就可以继续启动服务器了?

或者,如果在没有图形界面的shell上运行时,是否有办法跳过webbrowser.open这个步骤?

3 个回答

1

根据Python文档的说明:

在Unix系统下,如果有图形浏览器,系统会优先使用它们;如果没有图形浏览器或者没有X11显示,系统就会使用文本模式的浏览器。如果使用文本模式的浏览器,调用这个浏览器的程序会一直等待,直到用户关闭浏览器。

所以,你需要判断自己是否在一个只有控制台的环境中,如果是的话,就要采取适当的措施,比如不要打开浏览器。

另外,你也可以像Alexandre建议的那样,定义一个叫BROWSER的环境变量,然后让它运行一个脚本,这个脚本要么什么都不做,要么在后台打开浏览器,用&符号来实现。

1

在登录脚本中把 BROWSER 这个环境变量设置成像 w3m 这样的东西,应该能解决问题。

补充:我明白你不想让你的脚本在浏览器运行的时候被阻塞。

那这样的话,或许可以用简单一点的方式,比如:
BROWSER="echo 请用网页浏览器访问 %s" 这样会更好。

6

也许可以考虑使用线程?可以把服务器的设置放在一个单独的线程里,或者把打开浏览器的操作放在一个单独的线程里,像这样:

import threading
import webbrowser

def start_browser(server_ready_event, url):
    print "[Browser Thread] Waiting for server to start"
    server_ready_event.wait()
    print "[Browser Thread] Opening browser"
    webbrowser.open(url)

url = "someurl"
server_ready = threading.Event()
browser_thread = threading.Thread(target=start_browser, args=(server_ready, url))
browser_thread.start()

print "[Main Thread] Starting server"
httpd = make_server('', 80, server)
print "[Main Thread] Server started"
server_ready.set()

httpd.serve_forever()
browser_thread.join()

(把服务器设置放在主线程里,我觉得这样可以捕捉到 ctrl+c 的事件)

撰写回答