94 lines
3.1 KiB
Python
94 lines
3.1 KiB
Python
|
"""
|
||
|
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
|