forked from chrisbiggar/micropylis
/
micro.py
168 lines (132 loc) · 4.46 KB
/
micro.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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
'''
Created on Aug 29, 2015
@author: chris
'''
import imp, sys, os, shutil, logging, tempfile
import argparse
import pyglet
pyglet.options['debug_graphics_batch'] = False
tempDir = os.path.join(tempfile.gettempdir(), "micropylis")
def mainIsFrozen():
'''
Returns True if running from .exe
'''
return (hasattr(sys, "frozen") or # new py2exe
hasattr(sys, "importers") # old py2exe
or imp.is_frozen("__main__")) # tools/freeze
def doHighPriorityProcess():
import psutil
p = psutil.Process(os.getpid())
p.nice(psutil.HIGH_PRIORITY_CLASS)
def unpackResources(zipName, tempResDir):
if os.path.exists(tempDir):
shutil.rmtree(tempDir)
os.mkdir(tempDir)
import zipfile
zipFile = zipfile.ZipFile(zipName)
zipFile.extractall(tempDir)
def checkResources(zipName, tempDir):
'''
Unpacks resources if zipped.
returns True if resources are unpacked from zip.
'''
if os.path.isfile(zipName):
unpackResources(zipName, tempDir)
return True
else:
return False
def releaseAvbin():
'''
Frees Avbin .dll so windows will allow it to be deleted
:return:
'''
def deleteLib(daLib):
from _ctypes import FreeLibrary
hlib = daLib._handle
del daLib
FreeLibrary(hlib)
from pyglet.media import avbin
deleteLib(avbin.av)
deleteLib(avbinLib)
def initLogger(logFile=None, overwrite=False, level=logging.INFO):
fileName = None
if logFile:
if overwrite:
fileName = logFile
else:
fileName = logFile + "0"
n = 1
while os.path.isfile(fileName):
fileName = logFile + str(n)
n += 1
logHandler = logging.FileHandler(fileName)
elif logFile is None:
logHandler = logging.StreamHandler(sys.stdout)
logging.basicConfig()
logger = logging.getLogger(__name__)
logger.setLevel(level=level)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logHandler.setFormatter(formatter)
logger.addHandler(logHandler)
return fileName
def deleteLogFileIfEmpty(fileName):
'''
Closes logger handlers and deletes logfile if empty
:param fileName:
:return:
'''
logger = logging.getLogger(__name__)
for handler in logger.handlers[:]:
handler.close()
logger.removeHandler(handler)
if logFileName is not None and os.path.isfile(logFileName):
if os.stat(logFileName).st_size == 0:
os.remove(logFileName)
if __name__ == '__main__':
if mainIsFrozen(): # running from .exe
skipToCity = None
disableSound = False
pyglet.options['debug_gl'] = False
logFile = "micro_log_"
loggingLevel = logging.ERROR
overwriteLogFile = False
else: # running directly from python script
parser = argparse.ArgumentParser()
parser.add_argument('-d', '--debug-gl', dest='debugGl',
default=False, action="store_true")
parser.add_argument('--log-file', dest='logFile',
default=None)
parser.add_argument('--log-level', dest='logLevel',
default='ERROR')
parser.add_argument('--disable-sound', dest='disableSound',
default=False, action="store_true")
parser.add_argument('--skip-to-city', dest='skipToCity')
args = parser.parse_args()
pyglet.options['debug_gl'] = args.debugGl
skipToCity = args.skipToCity
disableSound = args.disableSound
logFile = args.logFile
loggingLevel = args.logLevel.upper()
overwriteLogFile = False
logFileName = initLogger(logFile, overwrite=overwriteLogFile, level=loggingLevel)
zippedResources = checkResources("res.zip", tempDir)
if zippedResources:
avbinDir = tempDir
pyglet.resource.path = [tempDir, '']
else:
avbinDir = ""
pyglet.resource.path = ['']
pyglet.resource.reindex()
avbinLib = pyglet.lib.load_library(os.path.join(avbinDir, 'avbin'))
pyglet.have_avbin = True
if zippedResources:
import gui
gui.tempDir = tempDir
from gui.microWindow import MicroWindow
app = MicroWindow(skipToCity, not disableSound)
pyglet.app.run()
if zippedResources:
# cleanup temp resources
releaseAvbin()
shutil.rmtree(tempDir)
deleteLogFileIfEmpty(logFileName)