Source code for nxpy.command.command
# nxpy.command package -------------------------------------------------------
# Copyright Nicola Musatti 2010 - 2012
# Use, modification, and distribution are subject to the Boost Software
# License, Version 1.0. (See accompanying file LICENSE.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
# See http://sourceforge.net/nxpy for library home page. ---------------------
r"""
Non interactive command driver.
"""
import logging
import os
import subprocess
import nxpy.core._impl.log
_log = logging.getLogger(__name__)
[docs]class Error(Exception):
r"""Raised when command execution fails."""
def __init__(self, cmd, returncode, err):
self.cmd = cmd
self.returncode = returncode
self.stderr = err
super(Error, self).__init__("%s(%d):\n%s" % ( cmd, returncode, err))
[docs]class Command(object):
r"""
Represents the command to be executed.
Typically you would derive from this class and provide a different method for each alternative
way of invoking the program. If the program you want to execute has many sub-commands you
might provide a different method for each sub-command. You can use the option.Config class to
declare the options supported by your command and then use the config.Parser class to validate
your methods' arguments and generate the resulting command line. A debug mode is available
in which commands are echoed rather than run. This can be enabled globally or separately for
each invocation.
"""
def __init__(self, cmd, debug=False):
r"""
Constructor.
Takes as arguments the command name and a boolean value indicating whether debug mode
should be activated for all executions of this command.
"""
self.cmd = cmd
self.debug = debug
[docs] def run(self, parser, debug=False):
r"""
Executes the command.
Takes as arguments a command line parser (see the option module) and a boolean indicating
whether debug mode should be used for this execution.
"""
os.environ["LANG"] = "C"
cmdline = []
if debug or self.debug:
cmdline.append("echo")
cmdline.append(self.cmd)
cmdline.append(parser.getCommandLine())
cmd = " ".join(cmdline)
_log.debug(cmd)
popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True,
universal_newlines=True)
out, err = popen.communicate(None)
_log.debug("----- OUTPUT -----")
_log.debug(out)
_log.debug("----- ERROR -----")
_log.debug(err)
if popen.returncode != 0:
raise Error(cmd, popen.returncode, err)
return out, err