[Python-Dev] Weird error handling in os._execvpe

Zack Weinberg zack@codesourcery.com
Thu, 1 Aug 2002 09:19:46 -0700


While testing my tempfile.py rewrite I ran into this mess in os.py:

def _execvpe(file, args, env=None):
    # ...
    if not _notfound:
        if sys.platform[:4] == 'beos':
            #  Process handling (fork, wait) under BeOS (up to 5.0)
            #  doesn't interoperate reliably with the thread interlocking
            #  that happens during an import.  The actual error we need
            #  is the same on BeOS for posix.open() et al., ENOENT.
            try: unlink('/_#.# ## #.#')
            except error, _notfound: pass
        else:
            import tempfile
            t = tempfile.mktemp()
            # Exec a file that is guaranteed not to exist
            try: execv(t, ('blah',))
            except error, _notfound: pass
    exc, arg = error, _notfound
    for dir in PATH:
        fullname = path.join(dir, file)
        try:
            apply(func, (fullname,) + argrest)
        except error, (errno, msg):
            if errno != arg[0]:
                exc, arg = error, (errno, msg)
    raise exc, arg

This appears to be an overcomplicated, unreliable way of writing

import errno

def _execvpe(file, args, env=None):
    # ...
    for dir in PATH:
	fullname = path.join(dir, file)
	try:
	    apply(func, (fullname,) + argrest)
	except error, (err, msg):
	    if err != errno.ENOENT: # and err != errno.ENOTDIR, maybe
	       raise
    raise error, (err, msg)

Can anyone explain why it is done this way?

zw