"""Execute shell commands via os.popen() and return status, output. | |
Interface summary: | |
import commands | |
outtext = commands.getoutput(cmd) | |
(exitstatus, outtext) = commands.getstatusoutput(cmd) | |
outtext = commands.getstatus(file) # returns output of "ls -ld file" | |
A trailing newline is removed from the output string. | |
Encapsulates the basic operation: | |
pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r') | |
text = pipe.read() | |
sts = pipe.close() | |
[Note: it would be nice to add functions to interpret the exit status.] | |
""" | |
from warnings import warnpy3k | |
warnpy3k("the commands module has been removed in Python 3.0; " | |
"use the subprocess module instead", stacklevel=2) | |
del warnpy3k | |
__all__ = ["getstatusoutput","getoutput","getstatus"] | |
# Module 'commands' | |
# | |
# Various tools for executing commands and looking at their output and status. | |
# | |
# NB This only works (and is only relevant) for UNIX. | |
# Get 'ls -l' status for an object into a string | |
# | |
def getstatus(file): | |
"""Return output of "ls -ld <file>" in a string.""" | |
import warnings | |
warnings.warn("commands.getstatus() is deprecated", DeprecationWarning, 2) | |
return getoutput('ls -ld' + mkarg(file)) | |
# Get the output from a shell command into a string. | |
# The exit status is ignored; a trailing newline is stripped. | |
# Assume the command will work with '{ ... ; } 2>&1' around it.. | |
# | |
def getoutput(cmd): | |
"""Return output (stdout or stderr) of executing cmd in a shell.""" | |
return getstatusoutput(cmd)[1] | |
# Ditto but preserving the exit status. | |
# Returns a pair (sts, output) | |
# | |
def getstatusoutput(cmd): | |
"""Return (status, output) of executing cmd in a shell.""" | |
import os | |
pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r') | |
text = pipe.read() | |
sts = pipe.close() | |
if sts is None: sts = 0 | |
if text[-1:] == '\n': text = text[:-1] | |
return sts, text | |
# Make command argument from directory and pathname (prefix space, add quotes). | |
# | |
def mk2arg(head, x): | |
import os | |
return mkarg(os.path.join(head, x)) | |
# Make a shell command argument from a string. | |
# Return a string beginning with a space followed by a shell-quoted | |
# version of the argument. | |
# Two strategies: enclose in single quotes if it contains none; | |
# otherwise, enclose in double quotes and prefix quotable characters | |
# with backslash. | |
# | |
def mkarg(x): | |
if '\'' not in x: | |
return ' \'' + x + '\'' | |
s = ' "' | |
for c in x: | |
if c in '\\$"`': | |
s = s + '\\' | |
s = s + c | |
s = s + '"' | |
return s |