javashell.py

来自「mallet是自然语言处理、机器学习领域的一个开源项目。」· Python 代码 · 共 194 行

PY
194
字号
"""Implement subshell functionality for Jython.This is mostly to provide the environ object for the os module,and subshell execution functionality for os.system and popen* functions.javashell attempts to determine a suitable command shell for the hostoperating system, and uses that shell to determine environment variablesand to provide subshell execution functionality."""from java.lang import System, Runtimefrom java.io import IOExceptionfrom java.io import InputStreamReaderfrom java.io import BufferedReaderfrom UserDict import UserDictimport jarrayimport stringimport sysimport types# circular dependency to let javaos import javashell lazily# without breaking LazyDict out into a new top-level modulefrom javaos import LazyDict __all__ = [ "shellexecute", "environ", "putenv", "getenv" ]def __warn( *args ):    print " ".join( [str( arg ) for arg in args ])    class _ShellEnv:    """Provide environment derived by spawning a subshell and parsing its    environment.  Also supports subshell execution functions and provides    empty environment support for platforms with unknown shell functionality.    """    def __init__( self, cmd=None, getEnv=None, keyTransform=None ):        """Construct _ShellEnv instance.        cmd: list of exec() arguments required to run a command in            subshell, or None        getEnv: shell command to list environment variables, or None        keyTransform: normalization function for environment keys,          such as 'string.upper', or None        """        self.cmd = cmd        self.getEnv = getEnv        self.environment = LazyDict(populate=self._getEnvironment,                                    keyTransform=keyTransform)        self._keyTransform = self.environment._keyTransform    def execute( self, cmd ):        """Execute cmd in a shell, and return the java.lang.Process instance.        Accepts either a string command to be executed in a shell,        or a sequence of [executable, args...].        """        shellCmd = self._formatCmd( cmd )        if self.environment._populated:            env = self._formatEnvironment( self.environment )        else:            env = None        try:            p = Runtime.getRuntime().exec( shellCmd, env )            return p        except IOException, ex:            raise OSError(                0,                "Failed to execute command (%s): %s" % ( shellCmd, ex )                )    ########## utility methods    def _formatCmd( self, cmd ):        """Format a command for execution in a shell."""        if self.cmd is None:            msgFmt = "Unable to execute commands in subshell because shell" \                     " functionality not implemented for OS %s with shell"  \                     " setting %s. Failed command=%s"""             raise OSError( 0, msgFmt % ( _osType, _envType, cmd ))                    if isinstance(cmd, types.StringType):            shellCmd = self.cmd + [cmd]        else:            shellCmd = cmd                    return shellCmd    def _formatEnvironment( self, env ):        """Format enviroment in lines suitable for Runtime.exec"""        lines = []        for keyValue in env.items():            lines.append( "%s=%s" % keyValue )        return lines    def _getEnvironment( self ):        """Get the environment variables by spawning a subshell.        This allows multi-line variables as long as subsequent lines do        not have '=' signs.        """        env = {}        if self.getEnv:            try:                p = self.execute( self.getEnv )                r = BufferedReader( InputStreamReader( p.getInputStream() ) )                lines = []                while True:                  line = r.readLine()                  if not line:                    break                  lines.append(line)                if '=' not in lines[0]:                    __warn(                        "Failed to get environment, getEnv command (%s) " \                        "did not print environment as key=value lines.\n" \                        "Output=%s" % ( self.getEnv, '\n'.join( lines ) )                        )                    return env                for line in lines:                    try:                        i = line.index( '=' )                        key = self._keyTransform(line[:i])                        value = line[i+1:] # remove = and end-of-line                    except ValueError:                        # found no '=', treat line as part of previous value                        value = '%s\n%s' % ( value, line )                    env[ key ] = value            except OSError, ex:                __warn( "Failed to get environment, environ will be empty:",                        ex )        return envdef _getOsType( os=None ):    """Select the OS behavior based on os argument, 'python.os' registry    setting and 'os.name' Java property.    os: explicitly select desired OS. os=None to autodetect, os='None' to    disable     """    os = str(os or sys.registry.getProperty( "python.os" ) or \               System.getProperty( "os.name" ))            _osTypeMap = (        ( "nt", ( 'nt', 'Windows NT', 'Windows NT 4.0', 'WindowsNT',                  'Windows 2000', 'Windows 2003', 'Windows XP', 'Windows CE' )),        ( "dos", ( 'dos', 'Windows 95', 'Windows 98', 'Windows ME' )),        ( "mac", ( 'mac', 'MacOS', 'Darwin' )),        ( "None", ( 'None', )),        )    foundType = None    for osType, patterns in _osTypeMap:        for pattern in patterns:            if os.startswith( pattern ):                foundType = osType                break        if foundType:            break    if not foundType:        foundType = "posix" # default - posix seems to vary most widely    return foundTypedef _getShellEnv():    # default to None/empty for shell and environment behavior    shellCmd = None    envCmd = None    envTransform = None    envType = sys.registry.getProperty("python.environment", "shell")    if envType == "shell":        osType = _getOsType()                # override defaults based on osType        if osType == "nt":            shellCmd = ["cmd", "/c"]            envCmd = "set"            envTransform = string.upper        elif osType == "dos":            shellCmd = ["command.com", "/c"]            envCmd = "set"            envTransform = string.upper        elif osType == "posix":            shellCmd = ["sh", "-c"]            envCmd = "env"        elif osType == "mac":            curdir = ':'  # override Posix directories            pardir = '::'         elif osType == "None":            pass        # else:        #    # may want a warning, but only at high verbosity:        #    __warn( "Unknown os type '%s', using default behavior." % osType )    return _ShellEnv( shellCmd, envCmd, envTransform )_shellEnv = _getShellEnv()shellexecute = _shellEnv.execute

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?