What can I use to call the OS to open a URL in whatever browser the user has as default? Not worried about cross-OS compatibility; if it works in linux thats enough for me!
5 Answers
Here is how to open the user's default browser with a given url:
import webbrowser
url = "https://www.google.com/"
webbrowser.open(url, new=0, autoraise=True)
Here is the documentation about this functionality. It's part of Python's stdlibs:
http://docs.python.org/library/webbrowser.html
I have tested this successfully on Linux, Ubuntu 10.10.
6 Comments
import antigravity uses: hg.python.org/cpython/file/tip/Lib/antigravity.pyPersonally I really wouldn't use the webbrowser module.
It's a complicated mess of sniffing for particular browsers, which will won't find the user's default browser if they have more than one installed, and won't find a browser if it doesn't know the name of it (eg Chrome).
Better on Windows is simply to use the os.startfile function, which also works on a URL. On OS X, you can use the open system command. On Linux there's xdg-open, a freedesktop.org standard command supported by GNOME, KDE and XFCE.
if sys.platform=='win32':
os.startfile(url)
elif sys.platform=='darwin':
subprocess.Popen(['open', url])
else:
try:
subprocess.Popen(['xdg-open', url])
except OSError:
print 'Please open a browser on: '+url
This will give a better user experience on mainstream platforms. You could fall back to webbrowser on other platforms, perhaps. Though most likely if you're on an obscure/unusual/embedded OS where none of the above work, chances are webbrowser will fail too.
4 Comments
xdg-open, though xdg-open uses similar sniffing anyway). The win32 implementation, for instance, uses os.startfile() already, and it also has a fallback.xdg-open now, too. Thus this answer is outdated on modern python and there is no reason not to use the webbrowser module.xdg-open throws an error for data: URLs. Simply running webbrowser.open("data:text/plain,Hello,%20World!") opens the correct browser (Firefox) on my system (Debian 11), though the user needs to refresh the page before it loads due to blog.mozilla.org/security/2017/11/27/…