Source code for pypsi.commands.system

#
# Copyright (c) 2015, Adam Meily <meily.adam@gmail.com>
# Pypsi - https://github.com/ameily/pypsi
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#

from pypsi.core import Command
import subprocess
import errno
import sys

SystemUsage = """usage: {name} COMMAND

execute a system shell command

positional arguments:
  COMMAND            command to execute"""


[docs]class SystemCommand(Command): ''' Execute a command on the parent shell. This command can be used as the shell's fallback command. ''' def __init__(self, name='system', topic='shell', use_shell=False, **kwargs): super(SystemCommand, self).__init__( name=name, topic=topic, brief='execute a system shell command', usage=SystemUsage.format(name=name), **kwargs ) self.use_shell = use_shell def run(self, shell, args): rc = None try: proc = subprocess.Popen( args, stdout=sys.stdout._get_target(), stdin=sys.stdin._get_target(), stderr=sys.stderr._get_target(), shell=self.use_shell ) except OSError as e: if e.errno == errno.ENOENT: self.error(shell, args[0], ": command not found") else: self.error(shell, args[0], ": ", e.strerror) return -e.errno try: rc = proc.wait() except KeyboardInterrupt: proc.kill() proc.communicate() rc = proc.wait() return rc
[docs] def fallback(self, shell, name, args): ''' Pass the command to the parent shell. ''' args.insert(0, name) return self.run(shell, args)