""" 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 host operating system, and uses that shell to determine environment variables and to provide subshell execution functionality. """ from java.lang import System, Runtime from java.io import File from java.io import IOException from java.io import InputStreamReader from java.io import BufferedReader from UserDict import UserDict import jarray import os import string import subprocess import sys import types import warnings warnings.warn('The javashell module is deprecated. Use the subprocess module.', DeprecationWarning, 2) __all__ = ["shellexecute"] 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. deprecated keyTransform: normalization function for environment keys, such as 'string.upper', or None. deprecated. """ self.cmd = cmd self.environment = os.environ 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 ) env = self._formatEnvironment( self.environment ) try: p = Runtime.getRuntime().exec( shellCmd, env, File(os.getcwd()) ) 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" \ " Failed command=%s" raise OSError( 0, msgFmt % ( os._name, cmd )) if isinstance(cmd, basestring): 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 _getOsType(): return os._name _shellEnv = _ShellEnv(subprocess._shell_command) shellexecute = _shellEnv.execute