pvl/invoke.py
author Tero Marttila <terom@paivola.fi>
Fri, 27 Dec 2013 00:35:10 +0200
changeset 28 69e1b91cd83f
parent 1 ce931075b69e
child 30 1053e69664a6
permissions -rw-r--r--
pvl.args: support multiple --config's
1
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    Invoke external commands, with python kwargs -> options mangling.
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
import subprocess
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
import logging
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
log = logging.getLogger('pvl.invoke')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
class InvokeError (Exception) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
    def __init__ (self, cmd, exit, error) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
        self.cmd = cmd
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
        self.exit = exit
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
        self.error = error
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
    def __str__ (self) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
        return "{self.cmd} failed ({self.exit}): {self.error}".format(self=self)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
def invoke (cmd, args, stdin=None) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
        Invoke a command directly.
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
        
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
        stdin:      
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
            False   -> passthrough stdin/stdout
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
            None    -> return lines of stdout
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
            [lines] -> write lines on stdin, return lines of stdout
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
        Raises InvokeError on nonzero exit, otherwise log.warn's any stderr.
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
    
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
    log.debug("{cmd} {args}".format(cmd=cmd, args=' '.join(args)))
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
    if stdin is False :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
        # keep process stdin/out
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
        io = None
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
        input = None
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
    elif stdin :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
        # return stdout, give stdin
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
        io = subprocess.PIPE
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
        input = '\n'.join(stdin) + '\n'
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
    else :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
        # return stdout
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
        io = subprocess.PIPE
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
        input = None
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
    p = subprocess.Popen([cmd] + args, stdin=io, stdout=io, stderr=io)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
    # get output
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
    # returns None if not io
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
    stdout, stderr = p.communicate(input=input)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
    if p.returncode :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
        # failed
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
        raise InvokeError(cmd, p.returncode, stderr)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
    elif stderr :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
        log.warning("%s: %s", cmd, stderr)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
    
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
    if stdout :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
        return stdout.splitlines()
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
    else :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
        return None
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
import collections
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
def process_opt (name, value) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
        Mangle from python keyword-argument dict format to command-line option tuple format.
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
        >>> process_opt('foo', True)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
        ('--foo',)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
        >>> process_opt('foo', 2)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
        ('--foo', '2')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
        >>> process_opt('foo', 'bar')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
        ('--foo', 'bar')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
        >>> process_opt('foo_bar', 'asdf')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
        ('--foo-bar', 'asdf')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
        # multi
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
        >>> process_opt('foo', ['bar', 'quux'])
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
        ('--foo', 'bar', '--foo', 'quux')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
        >>> process_opt('foo', [False, 'bar', True])
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
        ('--foo', 'bar', '--foo')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
        # empty
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
        >>> process_opt('foo', False)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
        ()
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
        >>> process_opt('foo', None)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
        ()
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
        >>> process_opt('bar', '')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
        ()
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
        Returns a tuple of argv items.
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
    # mangle opt
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
    opt = '--' + name.replace('_', '-')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
    if value is True :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
        # flag opt
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
        return (opt, )
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
    elif not value :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
        # flag opt / omit
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
        return ( )
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
    elif isinstance(value, basestring) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
        return (opt, value)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
    elif isinstance(value, collections.Iterable) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
        opts = (process_opt(name, subvalue) for subvalue in value)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
        # flatten
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
        return tuple(part for parts in opts for part in parts)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
    else :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
        # as-is
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
        return (opt, str(value))
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
def optargs (*args, **kwargs) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
        Convert args/options into command-line format
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
        >>> optargs('foo')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
        ['foo']
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
        >>> optargs(foo=True)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
        ['--foo']
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
        >>> optargs(foo=False)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
        []
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
        >>> optargs(foo='bar')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
        ['--foo', 'bar']
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   135
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
    ## opts
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   137
    # process
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   138
    opts = [process_opt(opt, value) for opt, value in kwargs.iteritems()]
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   139
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   140
    # flatten
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
    opts = [str(part) for parts in opts for part in parts]
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   142
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
    ## args
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
    args = [str(arg) for arg in args if arg]
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   145
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
    return opts + args
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   147
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
# XXX: move to pvl.utils or something random?
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   149
def merge (*dicts, **kwargs) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
        Merge given dicts together.
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
        
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   153
        >>> merge(foo=1, bar=2)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
        {'foo': 1, 'bar': 2}
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
        >>> merge(dict(foo=1), bar=2)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156
        {'foo': 1, 'bar': 2}
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   157
        >>> merge(dict(foo=1), bar=2, foo=3)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   158
        {'foo': 3, 'bar': 2}
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
        >>> merge(dict(foo=1), dict(bar=2), foo=3)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
        {'foo': 3, 'bar': 2}
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   161
        >>> merge(dict(bar=2), dict(foo=1), foo=3)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   162
        {'foo': 3, 'bar': 2}
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   163
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   164
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   166
    return dict((k, v) for d in (dicts + (kwargs, )) for k, v in d.iteritems())
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   168
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   169
def command (cmd, *args, **opts) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   170
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   171
        Invoke a command with options/arguments, given via Python arguments/keyword arguments.
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   172
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   173
        Return stdout.
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   174
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   175
    
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176
    log.debug("{cmd} {opts} {args}".format(cmd=cmd, args=args, opts=opts))
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   177
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   178
    # invoke
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   179
    return invoke(cmd, optargs(*args, **opts))
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   180
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   181
if __name__ == '__main__':
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   182
    import doctest
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
    doctest.testmod()
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   184