-
Notifications
You must be signed in to change notification settings - Fork 0
/
windowspath.py
116 lines (104 loc) · 3.05 KB
/
windowspath.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
112
113
114
115
116
'''This script contains common functions for manipulating paths in unix platforms.'''
import os
from sys import stderr
from subprocess import Popen
from shlex import split
from sys import stderr, stdout
from collections import OrderedDict
def setHeader(row):
# Returns ordered dict of header indeces
ret = OrderedDict()
for idx, i in enumerate(row):
i = i.strip().replace('"', '')
ret[i] = idx
return ret
def __printError__(msg):
# Prints formatted error message and exits
print(("\n\t[Error] {}. Exiting.\n").format(msg), file = stderr)
quit()
def checkDir(path, make = False):
# Checks if path exists, throws error if make is false, makes dir if true, returns formatted name
if type(path) != str:
__printError__(("{} is not a string").format(infile))
if path[-1] != os.path.sep:
path += os.path.sep
if os.path.isdir(path) == False:
if make == False:
__printError__(("{} not found").format(path))
else:
os.mkdir(path)
return path
def checkFile(infile):
# Raises if infile is not found
if type(infile) != str:
__printError__(("{} is not a string").format(infile))
if not os.path.isfile(infile):
__printError__(("{} not found").format(infile))
def getExt(name):
# Returns extension from filename
return name[name.rfind(".")+1:]
def getFileName(path):
# Returns filename sans path and extension
return path[path.rfind(os.path.sep)+1:path.find(".")]
def getParent(path):
# Returns parent directory from path
if "." in path and path[-1] != os.path.sep:
# Drop filename
path = path[:path.rfind(os.path.sep)]
elif path[-1] == os.path.sep:
path = path[:-1]
return path[path.rfind(os.path.sep)+1:]
def getDelim(line):
# Returns delimiter from test file
for i in ["\t", ",", " "]:
if i in line:
return i
printError("Cannot determine delimeter. Check file formatting")
def __callProc__(cmd, sout, serr):
# Calls process with given command and output
try:
call = Popen(split(cmd), stdout = sout, stderr = serr)
call.wait()
if call.returncode is not None:
return True
else:
return False
except:
s = cmd.split()
proc = s[0]
if "-" not in s[1]:
# Get subcommand if present
proc += " " + s[1]
elif proc == "java":
# Replace call to jar with name of jar
proc = getFileName(s[2])
print(("\t[Warning] Could not call {}").format(proc), file=stderr)
return False
def runProc(cmd, log = None):
# Wraps call to Popen, writes stdout/stdout err to log/devnull/stdout&stderr, returns True if no errors
if not log:
log = os.devnull
if log == "stdout" or log == "stderr":
# Pipe output to stdout/err
return __callProc__(cmd, stdout, stderr)
else:
with open(log, "w") as out:
# Pipe output to log
return __callProc__(cmd, out, out)
def readFile(infile, header = True, d = None):
# Creates generator to read file line by line
first = True
checkFile(infile)
with open(infile, "r") as f:
for line in f:
line = line.strip()
if not first:
yield line.split(d)
else:
if d is None:
d = getDelim(line)
if header:
yield setHeader(line.split(d))
else:
yield line.split(d)
first = False