-
Notifications
You must be signed in to change notification settings - Fork 0
/
pararun.py
111 lines (99 loc) · 3.34 KB
/
pararun.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/usr/bin/python
import itertools as it
import subprocess
import sys
import os
import job
class sformat(object):
def __init__(self, Type='s', width=1, precision=0):
self.Type=Type
self.width=width
self.precision=precision
def code_string(key, value, t, width=1, precision=0):
if t=='s':
return "_" + value
elif t=='f':
return "_" + key + '{val:0{width}.{precision}{type}}'.format(val=value, width=width, precision=precision, type=t)
elif t=='d':
return "_" + key + '{val:0{width}{type}}'.format(val=value, width=width, type=t)
def run_shell(cmd, logstring, append, email, mailcmd):
subprocess.call(cmd, shell=True)
class pararun:
def __init__(self, bcmd, plist, output=None, runfunc=None, modfunc=None, modpara=None, input=None, log='run', append=True, email='stollenwerk@th.physik.uni-bonn.de', mailcmd='mailx -s'):
self.basecmd=bcmd
self.para_list=plist
if output!=None:
self.output=output
self.output=output
if runfunc==None:
self.runfunc=run_shell
else:
self.runfunc=runfunc
self.log=log
self.append=append
self.email=email
self.mailcmd=mailcmd
self.modfunc=modfunc
self.modpara=modpara
self.input=input
#parse parameter list
self.names=list(pl[0] for pl in plist)
self.form=list(sformat(*pl[1]) for pl in plist)
self.keys=list(pl[2] for pl in plist)
self.parameter=list(it.product(*list(pl[3] for pl in plist)))
def run(self):
# remove log files if they exist
if os.path.exists("%s.log" % self.log):
os.remove("%s.log" % self.log)
if os.path.exists("%s.err" % self.log):
os.remove("%s.err" % self.log)
first=True
for para in self.parameter:
runcmd=self.basecmd
outputFolder=''
if self.output!=None:
outputFolder=self.output[1]
logstring=''
logstring=self.log
for f,n,k,p in zip(self.form, self.names, self.keys, para):
runcmd+=" %s %s" % (k,p)
outputFolder+= code_string(n, p, f.Type, f.width, f.precision)
if not self.append:
logstring+= code_string(n, p, f.Type, f.width, f.precision)
if self.input!=None and first:
runcmd+=" %s %s" % (self.input[0], self.input[1])
if self.output!=None:
runcmd+=" %s %s%s" % (self.output[0], outputFolder, self.output[2])
if self.modfunc!=None:
runcmd=self.modfunc(runcmd, *self.modpara)
self.runfunc(runcmd, logstring, self.append, self.email, self.mailcmd)
first=False
# specify how to execute the commands (optional, default is execution in shell)
def run_shell_log(cmd, logstring, append, email, mailcmd):
logfile= "%s.log" % logstring
fileMode='w'
if append:
fileMode='a'
fstdout = open(logfile, fileMode)
fstdout.write("run: %s\n" % cmd)
error_logfile= "%s.err" % logstring
fstderr = open(error_logfile, fileMode)
fstderr.write("run: %s\n" % cmd)
process=subprocess.Popen(cmd, shell=True, stdout=fstdout, stderr=fstderr)
fstdout.close()
fstderr.close()
process.wait()
status=process.returncode
#if status:
# sys.stderr.write("Warning: And error has occured during the run\n")
# sys.stderr.write("%s\n" % cmd)
# sys.stderr.write("See error log file %s.\n" % error_logfile)
#efile = open(error_logfile, 'r')
#for line in efile:
# sys.stderr.write(line)
def run_submit(cmd, logstring, append, email, mailcmd):
cmds=[cmd]
j=job.job(logstring, logstring, email, cmds, logappend=append, verbose=True, mailcmd=mailcmd)
j.run()
def run_print(cmd, logstring, append, email, mailcmd):
print cmd