Source code for nxpy.command.command
# nxpy.command package -------------------------------------------------------
# Copyright Nicola Musatti 2010 - 2014
# 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://nxpy.sourceforge.net for library home page. ---------------------
r"""
Non interactive command driver.
"""
from __future__ import absolute_import
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."""
[docs] def __init__(self, cmd, returncode, err):
r"""Takes the command line, the error code and the contents of the error stream."""
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
:py:class:`.option.Config` class to declare the options supported by your command and then use
the :py:class:`.option.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.
"""
[docs] def __init__(self, cmd, debug=False):
r"""
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