import errno
import os
import pwd

def get_user():
    # Seen in
    # http://cr.opensolaris.org/~migi/24_09_os_unix_using_osgetlogin_3595/test1.py
    def __get_username():
        # Cron jobs, at least in Ubuntu, are more likely to have LOGNAME set
        # than USER.
        #
        # Note that environment variables are easily forged...
        #
        user = os.getenv('USER') or os.getenv('LOGNAME') or \
               os.getenv('USERNAME')

        if not user:
            # ...but when su is being used it's hard to tell in advance
            # whether the uid or euid is wanted.
            return pwd.getpwuid(os.getuid()).pw_name

        return user

    try:
        # os.getlogin() is limited to whatever POSIX getlogin() does.
        return os.getlogin()
    except AttributeError:
        # os.getlogin() not available on this platform.
        return __get_username()
    except OSError, e:
        if e.errno == errno.ENOTTY:
            # Known failure case for gksu.
            return __get_username()
        else:
            # In most cases, just do an os.getlogin() yourself if you want to see the error.
            #print "os.getlogin() raised exception", e
            #print "get_user() is using __get_username() instead of os.getlogin()."
            return __get_username()
        #raise