正在显示
1 个修改的文件
包含
174 行增加
和
0 行删除
src/python/dmap/utils.py
0 → 100644
1 | + | ||
2 | +import os | ||
3 | +import sys | ||
4 | +import traceback | ||
5 | +import glob | ||
6 | +import os.path | ||
7 | +import configparser | ||
8 | +import warnings | ||
9 | +import codecs | ||
10 | +import time | ||
11 | + | ||
12 | +####################### | ||
13 | +# PLUGINS | ||
14 | + | ||
15 | +# list of plugin paths. it gets filled in by the QGIS python library | ||
16 | +plugin_paths = [] | ||
17 | + | ||
18 | +# dictionary of plugins | ||
19 | +plugins = {} | ||
20 | + | ||
21 | +available_plugins = [] | ||
22 | + | ||
23 | +plugins_metadata_parser = {} | ||
24 | + | ||
25 | +def findPlugins(path): | ||
26 | + """ for internal use: return list of plugins in given path """ | ||
27 | + for plugin in glob.glob(path + "/*"): | ||
28 | + if not os.path.isdir(plugin): | ||
29 | + continue | ||
30 | + if not os.path.exists(os.path.join(plugin, '__init__.py')): | ||
31 | + continue | ||
32 | + | ||
33 | + metadataFile = os.path.join(plugin, 'metadata.txt') | ||
34 | + if not os.path.exists(metadataFile): | ||
35 | + continue | ||
36 | + | ||
37 | + cp = configparser.ConfigParser() | ||
38 | + | ||
39 | + try: | ||
40 | + with codecs.open(metadataFile, "r", "utf8") as f: | ||
41 | + cp.read_file(f) | ||
42 | + except: | ||
43 | + cp = None | ||
44 | + | ||
45 | + pluginName = os.path.basename(plugin) | ||
46 | + yield (pluginName, cp) | ||
47 | + | ||
48 | + | ||
49 | +def metadataParser(): | ||
50 | + """Used by other modules to access the local parser object""" | ||
51 | + return plugins_metadata_parser | ||
52 | + | ||
53 | + | ||
54 | +def updateAvailablePlugins(): | ||
55 | + """ Go through the plugin_paths list and find out what plugins are available. """ | ||
56 | + # merge the lists | ||
57 | + plugins = [] | ||
58 | + metadata_parser = {} | ||
59 | + for pluginpath in plugin_paths: | ||
60 | + for pluginName, parser in findPlugins(pluginpath): | ||
61 | + if parser is None: | ||
62 | + continue | ||
63 | + if pluginName not in plugins: | ||
64 | + plugins.append(pluginName) | ||
65 | + metadata_parser[pluginName] = parser | ||
66 | + | ||
67 | + global available_plugins | ||
68 | + available_plugins = plugins | ||
69 | + global plugins_metadata_parser | ||
70 | + plugins_metadata_parser = metadata_parser | ||
71 | + | ||
72 | + | ||
73 | +def pluginMetadata(packageName, fct): | ||
74 | + """ fetch metadata from a plugin - use values from metadata.txt """ | ||
75 | + try: | ||
76 | + return plugins_metadata_parser[packageName].get('general', fct) | ||
77 | + except Exception: | ||
78 | + return "__error__" | ||
79 | + | ||
80 | + | ||
81 | +def loadPlugin(packageName): | ||
82 | + """ load plugin's package """ | ||
83 | + | ||
84 | + try: | ||
85 | + __import__(packageName) | ||
86 | + return True | ||
87 | + except: | ||
88 | + pass # continue... | ||
89 | + | ||
90 | + # snake in the grass, we know it's there | ||
91 | + sys.path_importer_cache.clear() | ||
92 | + | ||
93 | + # retry | ||
94 | + try: | ||
95 | + __import__(packageName) | ||
96 | + return True | ||
97 | + except: | ||
98 | + print("Couldn't load plugin '%s'" % (packageName)) | ||
99 | + return False | ||
100 | + | ||
101 | + | ||
102 | +def _unloadPluginModules(packageName): | ||
103 | + """ unload plugin package with all its modules (files) """ | ||
104 | + global _plugin_modules | ||
105 | + mods = _plugin_modules[packageName] | ||
106 | + | ||
107 | + for mod in mods: | ||
108 | + if not mod in sys.modules: | ||
109 | + continue | ||
110 | + | ||
111 | + # try removing path | ||
112 | + if hasattr(sys.modules[mod], '__path__'): | ||
113 | + for path in sys.modules[mod].__path__: | ||
114 | + try: | ||
115 | + sys.path.remove(path) | ||
116 | + except ValueError: | ||
117 | + # Discard if path is not there | ||
118 | + pass | ||
119 | + | ||
120 | + # try to remove the module from python | ||
121 | + try: | ||
122 | + del sys.modules[mod] | ||
123 | + except: | ||
124 | + print("Error when removing module:\n%s" % traceback.format_exc()) | ||
125 | + # remove the plugin entry | ||
126 | + del _plugin_modules[packageName] | ||
127 | + | ||
128 | +####################### | ||
129 | +# SERVER PLUGINS | ||
130 | +# | ||
131 | + | ||
132 | +# list of plugin paths. it gets filled in by the QGIS python library | ||
133 | +server_plugin_paths = [] | ||
134 | + | ||
135 | +# dictionary of plugins | ||
136 | +server_plugins = {} | ||
137 | + | ||
138 | +# list of active (started) plugins | ||
139 | +server_active_plugins = [] | ||
140 | + | ||
141 | +# initialize 'serverIface' object | ||
142 | +serverIface = None | ||
143 | + | ||
144 | +def initServerInterface(serverIface_): | ||
145 | + #from qgis.server import DmpServerInterface | ||
146 | + #from sip import wrapinstance | ||
147 | + #sys.excepthook = sys.__excepthook__ | ||
148 | + global serverIface | ||
149 | + serverIface = serverIface_ | ||
150 | + | ||
151 | + | ||
152 | +def startServerPlugin(packageName): | ||
153 | + """ initialize the plugin """ | ||
154 | + global server_plugins, server_active_plugins, serverIface | ||
155 | + | ||
156 | + if packageName in server_active_plugins: | ||
157 | + return False | ||
158 | + if packageName not in sys.modules: | ||
159 | + return False | ||
160 | + | ||
161 | + package = sys.modules[packageName] | ||
162 | + errMsg = "Couldn't load server plugin: %s" %(packageName) | ||
163 | + | ||
164 | + # create an instance of the plugin | ||
165 | + try: | ||
166 | + server_plugins[packageName] = package.serverClassFactory(serverIface) | ||
167 | + except: | ||
168 | + _unloadPluginModules(packageName) | ||
169 | + print("%s ,due to an error when calling its serverClassFactory() method." %(errMsg)) | ||
170 | + return False | ||
171 | + | ||
172 | + # add to active plugins | ||
173 | + server_active_plugins.append(packageName) | ||
174 | + return True |
请
注册
或
登录
后发表评论