pvl/invoke.py
author Tero Marttila <terom@paivola.fi>
Sat, 08 Mar 2014 14:37:20 +0200
changeset 30 1053e69664a6
parent 1 ce931075b69e
permissions -rw-r--r--
pvl.invoke: setenv
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
30
1053e69664a6 pvl.invoke: setenv
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
     5
import logging
1053e69664a6 pvl.invoke: setenv
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
     6
import os
1
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
import subprocess
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
log = logging.getLogger('pvl.invoke')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
class InvokeError (Exception) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
    def __init__ (self, cmd, exit, error) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
        self.cmd = cmd
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
        self.exit = exit
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
        self.error = error
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
    def __str__ (self) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
        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
    19
30
1053e69664a6 pvl.invoke: setenv
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    20
def invoke (cmd, args, stdin=None, setenv=None) :
1
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
        Invoke a command directly.
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
        
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
        stdin:      
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
            False   -> passthrough stdin/stdout
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
            None    -> return lines of stdout
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
            [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
    28
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
        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
    30
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
    
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
    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
    33
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
    if stdin is False :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
        # keep process stdin/out
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
        io = None
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
        input = None
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
    elif stdin :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
        # return stdout, give stdin
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
        io = subprocess.PIPE
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
        input = '\n'.join(stdin) + '\n'
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
    else :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
        # return stdout
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
        io = subprocess.PIPE
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
        input = None
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
30
1053e69664a6 pvl.invoke: setenv
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    49
    if setenv :
1053e69664a6 pvl.invoke: setenv
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    50
        env = dict(os.environ)
1053e69664a6 pvl.invoke: setenv
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    51
        env.update(setenv)
1053e69664a6 pvl.invoke: setenv
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    52
1053e69664a6 pvl.invoke: setenv
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    53
    else :
1053e69664a6 pvl.invoke: setenv
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    54
        env = None
1053e69664a6 pvl.invoke: setenv
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    55
1053e69664a6 pvl.invoke: setenv
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    56
    p = subprocess.Popen([cmd] + list(args), stdin=io, stdout=io, stderr=io, env=env)
1
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
    # get output
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
    # returns None if not io
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
    stdout, stderr = p.communicate(input=input)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
    if p.returncode :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
        # failed
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
        raise InvokeError(cmd, p.returncode, stderr)
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
    elif stderr :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
        log.warning("%s: %s", cmd, stderr)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
    
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
    if stdout :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
        return stdout.splitlines()
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
    else :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
        return None
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
import collections
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
def process_opt (name, value) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
        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
    79
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
        >>> process_opt('foo', True)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
        ('--foo',)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
        >>> process_opt('foo', 2)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
        ('--foo', '2')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
        >>> process_opt('foo', 'bar')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
        ('--foo', 'bar')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
        >>> process_opt('foo_bar', 'asdf')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
        ('--foo-bar', 'asdf')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
        # multi
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
        >>> process_opt('foo', ['bar', 'quux'])
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
        ('--foo', 'bar', '--foo', 'quux')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
        >>> process_opt('foo', [False, 'bar', True])
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
        ('--foo', 'bar', '--foo')
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
        # empty
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
        >>> process_opt('foo', False)
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
        >>> process_opt('foo', None)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
        ()
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
        >>> process_opt('bar', '')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
        ()
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
        Returns a tuple of argv items.
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
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
    # mangle opt
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
    opt = '--' + name.replace('_', '-')
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
    if value is True :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
        # flag opt
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
        return (opt, )
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
    elif not value :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
        # flag opt / omit
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
        return ( )
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
    elif isinstance(value, basestring) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
        return (opt, value)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
    elif isinstance(value, collections.Iterable) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
        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
   122
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
        # flatten
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
        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
   125
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
    else :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
        # as-is
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
        return (opt, str(value))
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
def optargs (*args, **kwargs) :
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
        Convert args/options into command-line format
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
        >>> optargs('foo')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   135
        ['foo']
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
        >>> optargs(foo=True)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   137
        ['--foo']
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   138
        >>> optargs(foo=False)
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
        >>> optargs(foo='bar')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
        ['--foo', 'bar']
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
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
    ## opts
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   145
    # process
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
    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
   147
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
    # flatten
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   149
    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
   150
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
    ## args
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
    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
   153
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
    return opts + args
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156
# XXX: move to pvl.utils or something random?
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   157
def merge (*dicts, **kwargs) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   158
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
        Merge given dicts together.
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
        
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   161
        >>> merge(foo=1, bar=2)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   162
        {'foo': 1, 'bar': 2}
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   163
        >>> merge(dict(foo=1), bar=2)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   164
        {'foo': 1, 'bar': 2}
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
        >>> merge(dict(foo=1), bar=2, foo=3)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   166
        {'foo': 3, 'bar': 2}
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
        >>> 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
   168
        {'foo': 3, 'bar': 2}
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   169
        >>> 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
   170
        {'foo': 3, 'bar': 2}
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   171
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
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   174
    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
   175
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   177
def command (cmd, *args, **opts) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   178
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   179
        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
   180
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   181
        Return stdout.
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   182
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
    
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   184
    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
   185
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
    # invoke
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
    return invoke(cmd, optargs(*args, **opts))
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
if __name__ == '__main__':
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
    import doctest
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
    doctest.testmod()
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192