author | Tero Marttila <terom@paivola.fi> |
Fri, 20 Sep 2013 15:05:28 +0300 | |
changeset 17 | 9bd35c091f05 |
parent 1 | ce931075b69e |
child 30 | 1053e69664a6 |
permissions | -rw-r--r-- |
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 |