This repository was archived by the owner on Sep 13, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy path__init__.py
102 lines (81 loc) · 3.07 KB
/
__init__.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
# License: MIT
'''
:author: Nitin Madnani ([email protected])
:organization: ETS
'''
import _ctypes
import ctypes as c
import os
from .Tagger import Tagger
from .Parser import Parser
from .DepParser import DepParser
__all__ = ['Tagger', 'Parser', 'DepParser']
class ZPar(object):
"""The ZPar wrapper object"""
def __init__(self, modelpath):
super(ZPar, self).__init__()
# get a pointer to the zpar shared library
base_path = os.path.dirname(os.path.abspath(__file__))
zpar_path = os.path.join(base_path, 'dist', 'zpar.so')
self.libptr = c.cdll.LoadLibrary(zpar_path)
# call the library's initialize method to instantiate
# the session object associated with this session
self._initialize = self.libptr.initialize
self._initialize.restype = c.c_void_p
self._initialize.argtypes = None
self._zpar_session_obj = self._initialize()
self.modelpath = modelpath
self.tagger = None
self.parser = None
self.depparser = None
def close(self):
# unload the models on the C++ side
_unload_models = self.libptr.unload_models
_unload_models.restype = None
_unload_models.argtypes = [c.c_void_p]
self.libptr.unload_models(self._zpar_session_obj)
# clean up the data structures on the python side
if self.tagger:
self.tagger.cleanup()
if self.parser:
self.parser.cleanup()
if self.depparser:
self.depparser.cleanup()
# set all the fields to none to enable clean reuse
self.tagger = None
self.parser = None
self.depparser = None
self.modelpath = None
# clean up the CDLL object too so that upon reuse, we get a new one
_ctypes.dlclose(self.libptr._handle)
# pretty sure once the old object libptr was pointed to should
# get garbage collected at some point after this
self.libptr = None
self._zpar_session_obj = None
def __enter__(self):
"""Enable ZPar to be used as a ContextManager"""
return self
def __exit__(self, type, value, traceback):
"""Clean up when done"""
self.close()
def get_tagger(self):
if not self.libptr:
raise Exception('Cannot get tagger from uninitialized ZPar environment.')
return None
else:
self.tagger = Tagger(self.modelpath, self.libptr, self._zpar_session_obj)
return self.tagger
def get_parser(self):
if not self.libptr:
raise Exception('Cannot get parser from uninitialized ZPar environment.')
return None
else:
self.parser = Parser(self.modelpath, self.libptr, self._zpar_session_obj)
return self.parser
def get_depparser(self):
if not self.libptr:
raise Exception('Cannot get parser from uninitialized ZPar environment.')
return None
else:
self.depparser = DepParser(self.modelpath, self.libptr, self._zpar_session_obj)
return self.depparser