How to start up the default web browser on win32

Oliver Schaefer SchaeferFFM at hotmail.com
Wed Mar 1 19:01:32 EST 2000


T. C. Huang <a00tch00 at nchc.gov.tw> wrote:
> Hi,
>
>      I want to write a python script to start up the default web browser
> on Win32 platform. I'm not
> familiar with Win32, anyone can help me?
>
> T. C. Huang
>

Try this:

[code]------------------------------------------------------------------
#! python

# dde_op.py

"""\
preview support with dde and WinExec.

Usage:

(assuming the builtin __debug__ is set to 1)

>>> import dde_op

>>> dde_op.preview(r'file:///D:/Programme/Python/Doc/index.html')
hkey: -1070463376
value of key ".html": htmlfile
hkey: -1055374168
value of key "command": "D:\PROGRA~1\INTERN~1\iexplore.exe" -nohome
execute('"D:\PROGRA~1\INTERN~1\iexplore.exe" -nohome',
        '"file:///D:/Programme/Python/Doc/index.html"',
        '"file:///D:/Programme/Python/Doc/index.html"',
        'WWW_OpenURL', 'IExplore')
dde_exec('"D:\PROGRA~1\INTERN~1\iexplore.exe" -nohome',
         '"file:///D:/Programme/Python/Doc/index.html"',
         'WWW_OpenURL', 'IExplore')
connected
error: Exec failed  ### this happens every time with Internet Explorer
                    ### but works anyway!
>>>

Hint: if you don't want debugging support, remove debug() calls...
"""

import sys
from cStringIO import StringIO
from string import lower, rfind

# import some of Mark Hammond's Windows extensions...
from win32api import RegOpenKey, RegQueryValue, RegCloseKey, WinExec
from win32con import HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, \
     HKEY_CLASSES_ROOT
from dde import CreateServer, CreateTopic, CreateConversation


### debugging support ###

class Debug:
    def __init__(self, state):
        self.state = state
        self.write = sys.stderr.write
    def on(self):
        self.state = 1
    def off(self):
        self.state = 0
    def __nonzero__(self):
        return self.state
    def __call__(self, arg):
        self.state and self.write('%s\n' % arg)
# class Debug

import __builtin__
__builtin__.debug = Debug(__debug__)
del __builtin__, Debug


### dde support ###

def dde_exec(app, cmd, topic=None, service=None):
    if topic is None:
        topic = "WWW_OpenURL"
    if service is None:
        service = "NSShell"

    server = CreateServer()
    server.Create(app)
    Topic = CreateTopic(topic)
    server.AddTopic(Topic)
    conv = CreateConversation(server)

    ret = None
    try:
        conv.ConnectTo(service, topic)
        if conv.Connected():
            debug('connected')
            # conv.Exec sometimes complained, but every time
            # conv.Connected() was true, conv.Exec did the
            # job anyway...
            ret = 'success'
            conv.Exec(cmd)
            debug('success')
    except:
        etype, evalue = sys.exc_info()[:2]
        debug("%s: %s" % (etype, evalue))
    server.Destroy()
    return ret
# def dde_exec(app, cmd, topic=None, service=None)

def execute(app, cmd, dde_cmd=None, topic=None, service=None):
    """\
    Execute an app; if possible with dde, otherwise with WinExec.
    """
    if topic is None:
        topic = "WWW_OpenURL"
    if service is None:
        service = "NSShell"
    if dde_cmd is None:
        dde_cmd = cmd

    try:
        debug("dde_exec('%s', '%s', '%s', '%s')" % (app, dde_cmd,
                                                    topic, service))
        if not dde_exec(app, dde_cmd, topic, service):
            debug("WinExec('%s' '%s')" % (app, cmd))
            WinExec("%s %s" % (app, cmd))
    except:
        etype, evalue = sys.exc_info()[:2]
        debug("%s: %s" % (etype, evalue))
# def execute(app, cmd, dde_cmd=None, topic=None, service=None)


### registry support ###

def RegDefaultValue(name, hkey=None, subkey=None):
    if hkey is None:
        hkey = HKEY_LOCAL_MACHINE
    if subkey is None:
        subkey = r'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths'

    try:
        hkey = RegOpenKey(hkey, subkey)
        debug('hkey: %d' % hkey.handle)
        value = RegQueryValue(hkey, name)
        debug('value of key "%s": %s' % (name, value))
    except:
        etype, evalue = sys.exc_info()[:2]
        debug("%s: %s" % (etype, evalue))
        value = None
    RegCloseKey(hkey)
    return value
# def RegDefaultValue(name, hkey=None, subkey=None)

def RegGetValue(name, hkey=None, subkey=None):
    if hkey is None:
        hkey = HKEY_LOCAL_MACHINE
    if subkey is None:
        subkey = ''

    try:
        hkey = RegOpenKey(hkey, subkey)
        debug('hkey: %d' % hkey.handle)
        value, type = RegQueryValueEx(hkey, name)
        debug('value of "%s": %s (type = %s)' % (name, value, type))
    except:
        etype, evalue = sys.exc_info()[:2]
        debug("%s: %s" % (etype, evalue))
        value = None
    RegCloseKey(hkey)
    return value
# def RegGetValue(name, hkey=None, subkey=None)


### main part of the preview method for Template/HTML objects ###

def preview(src, browser='default'):
    if not src:
        raise ValueError, 'object is not associated with a source file'

    cmd = '"%s"' % src # src can be an instance with __str__ method
    app = lower(browser)

    topic = "WWW_OpenURL"
    dde_cmd = cmd

    stderr, sys.stderr = sys.stderr, StringIO()

    try:
        if app == 'default':
            key = RegDefaultValue('.html', HKEY_CLASSES_ROOT, '')
            if not key:
                raise ValueError, 'no default web browser registered'

            key = r'%s\shell\open' % key
            app = RegDefaultValue('command', HKEY_CLASSES_ROOT, key)

            if rfind(lower(app), 'iexplore.exe') != -1:
                service = "IExplore"
            else:
                service = "NSShell"
        elif app in ('netscape', 'navigator', 'communicator'):
            app = RegDefaultValue('NETSCAPE.EXE')
            service = "NSShell"
        elif app in ('ie', 'iexplore', 'internet explorer', 'explorer'):
            app = RegDefaultValue('IEXPLORE.EXE')
            service = "IExplore"
        else:
            app = RegDefaultValue(browser) or browser
            topic = "System"

            pos1 = rfind(browser, '\\') + 1
            pos2 = rfind(browser, '.')
            if pos2 == -1: pos2 = len(browser)

            service = browser[pos1:pos2]

        debug("execute('%s', '%s', '%s', '%s', '%s')" % \
              (app, cmd, dde_cmd, topic, service))
        execute(app, cmd, dde_cmd, topic, service)
    finally:
        sys.stderr, stderr = stderr, sys.stderr
        debug(stderr.getvalue())
# def preview(src, browser='default')

def test(arg=None):
    if arg:
        preview(arg[1])
    else:
        try:
            src = raw_input('file to previw: ')
        except KeyboardInterrupt:
            src = None
        if src:
            preview(src)
        else:
            print 'filename not valid.'
# def test(arg=None)

if __name__ == '__main__':
    test(sys.argv[1:])

[/code]-------------------------------------------------------------------


Hope this helps,

Regards,
Oliver Schaefer  [ SchaeferFFM at gmx.de ]









More information about the Python-list mailing list