为äºæ©å
软件çåè½ï¼é常æ们ä¼æ软件设计ææ件å¼ç»æãPythonè¿æ ·çå¨æè¯è¨å¤©çå°±æ¯ææ件å¼ç¼ç¨ãä¸C++ç¸æ¯ï¼Pythonå·²ç»å®ä¹å¥½æ¨¡åçæ¥å£ï¼æ³è¦è½½å
¥ä¸ä¸ªæ件ï¼ä¸ä¸ª__import__()å°±è½å¾è½»æ¾å°æå®ãä¸éè¦ç¹å®çåºå±ç¥è¯ãèä¸ä¸C++çéæè¯è¨ç¸æ¯ï¼Pythonçæ件å¼ç»ææ´æ¾çµæ´»ãå 为æ件载å
¥åï¼å¯ä»¥å©ç¨Pythonè¯è¨çå¨ææ§ï¼å
åå°ä¿®æ¹æ ¸å¿çé»è¾ã
ç®åå°è¯´ä¸ä¸ª__import__()å¯è½ä¸å¤§æ¸
æ¥ãç°å¨å°±æ¥çä¸ä¸ªæç®åçæ件å¼ç»æç¨åºãå®ä¼æ«æpluginsæ件夹ä¸çææ.pyæ件ãç¶åæå®ä»¬è½½å
¥ã
#-*- encoding: utf-8 -*-#main1.pyimport osclass Platform:
def __init__(self):
self.loadPlugins()
def sayHello(self, from_):
print "hello from %s." % from_
def loadPlugins(self):
for filename in os.listdir("plugins"):
if not filename.endswith(".py") or filename.startswith("_"):
continue
self.runPlugin(filename)
def runPlugin(self, filename):
pluginName=os.path.splitext(filename)[0]
plugin=__import__("plugins."+pluginName, fromlist=[pluginName])
#Errors may be occured. Handle it yourself.
plugin.run(self)if __name__=="__main__":
platform=Platform()
ç¶åå¨pluginsåç®å½éé¢æ¾å
¥ä¸¤ä¸ªæ件ï¼
#plugins1.pydef run(platform):
platform.sayHello("plugin1")#plugins2.pydef run(platform):
platform.sayHello("plugin2")
åå建ä¸ä¸ªç©ºç__init__.pyå¨pluginsæ件夹éé¢ãä»packageéé¢å¯¼å
¥æ¨¡åçæ¶åï¼Pythonè¦æ±ä¸ä¸ª__init__.pyã
è¿è¡main1.pyï¼çä¸ä¸è¿è¡çç»æãé¦å
æ¯æå°ä¸ä¸æ件夹ç»ææ¹ä¾¿å¤§å®¶ç解ï¼
h:\projects\workon\testplugins>tree /f /a
å· Data çæ件夹 PATH å表
å·åºåå·ä¸º ****-****
H:.
| main1.py
|
\---plugins
plugin1.py
plugin2.py
__init__.py
h:\projects\workon\testplugins>main1.py
hello from plugin1.
hello from plugin2.
ä¸è¬å°ï¼è½½å
¥æ件åè¦é¦å
æ«ææ件ï¼ç¶åä¾æ¬¡è½½å
¥å¹¶è¿è¡æ件ãæ们ä¸é¢ç示ä¾ç¨åºmain1.pyä¹æ¯å¦æ¤ï¼å为两个å½æ°ã第ä¸ä¸ªloadPlugins()æ«ææ件ãå®æpluginsç®å½ä¸é¢ææ.pyçæ件é¤äº__init__.pyé½å½ææ件ãrunPlugin()è½½å
¥å¹¶è¿è¡æ件ãå
¶ä¸ä¸¤ä¸ªå
³é®ï¼ä½¿ç¨__import__()å½æ°ææ件å½æ模å导å
¥ï¼å®è¦æ±ææçæ件é½å®ä¹ä¸ä¸ªrun()å½æ°ãåç§è¯è¨å®ç°çæ件å¼ç»æå
¶å®ä¹åºæ¬ä¸å为è¿ä¸¤ä¸ªæ¥éª¤ãæä¸åçæ¯ï¼Pythonè¯è¨å®ç°èµ·æ¥æ´å çç®æ´ã
æ许å¬èµ·æ¥è¿æç¹ç奥ã详ç»å°è¯´ä¸ä¸__import__()ãå®å常è§çimportè¯å¥å¾ç¸ä¼¼ï¼åªä¸è¿æ¢æå½æ°å½¢å¼å¹¶ä¸è¿å模å以ä¾è°ç¨ãimport moduleç¸å½äº__import__("module")ï¼from module import funcç¸å½äº__import__("module", fromlist=["func"])ï¼ä¸è¿ä¸æ³è±¡æç¹ä¸åï¼import package.moduleç¸å½äº__import__("package.module", fromlist=["module"])ã
å¦ä½è°ç¨æ件ä¸è¬æ个约å®ãåæ们è¿é就约å®æ¯ä¸ªæ件é½å®ç°ä¸ä¸ªrun()ãææ¶åè¿å¯ä»¥çº¦å®å®ç°ä¸ä¸ªç±»ï¼å¹¶ä¸è¦æ±è¿ä¸ªç±»å®ç°æ个管çæ¥å£ï¼ä»¥æ¹ä¾¿æ ¸å¿éæ¶å¯å¨ãåæ¢æ件ãè¦æ±ææçæ件é½æè¿å 个æ¥å£æ¹æ³ï¼
#interfaces.pyclass Plugin:
def setPlatform(self, platform):
self.platform=platform
def start(self):
pass
def stop(self):
pass
æ³è¦è¿è¡è¿ä¸ªæ件ï¼æ们çrunPlugin()è¦æ¹ä¸æ¹ï¼å¦å¤å¢å ä¸ä¸ªshutdown()æ¥åæ¢æ件:
class Platform:
def __init__(self):
self.plugins=[]
self.loadPlugins()
def sayHello(self, from_):
print "hello from %s." % from_
def loadPlugins(self):
for filename in os.listdir("plugins"):
if not filename.endswith(".py") or filename.startswith("_"):
continue
self.runPlugin(filename)
def runPlugin(self, filename):
pluginName=os.path.splitext(filename)[0]
plugin=__import__("plugins."+pluginName, fromlist=[pluginName])
clazz=plugin.getPluginClass()
o=clazz()
o.setPlatform(self)
o.start()
self.plugins.append(o)
def shutdown(self):
for o in self.plugins:
o.stop()
o.setPlatform(None)
self.plugins=[]if __name__=="__main__":
platform=Platform()
platform.shutdown()
æ件æ¹æè¿æ ·ï¼
#plugins1.pyclass Plugin1:
def setPlatform(self, platform):
self.platform=platform
def start(self):
self.platform.sayHello("plugin1")
def stop(self):
self.platform.sayGoodbye("plugin1")def getPluginClass():
return Plugin1#plugins2.pydef sayGoodbye(self, from_):
print "goodbye from %s." % from_class Plugin2:
def setPlatform(self, platform):
self.platform=platform
if platform is not None:
platform.__class__.sayGoodbye=sayGoodbye
def start(self):
self.platform.sayHello("plugin2")
def stop(self):
self.platform.sayGoodbye("plugin2")def getPluginClass():
return Plugin2
è¿è¡ç»æï¼
h:\projects\workon\testplugins>main.py
hello from plugin1.
hello from plugin2.
goodbye from plugin1.
goodbye from plugin2.
详ç»è§å¯çæå们å¯è½ä¼åç°ï¼ä¸é¢çmain.py,plugin1.py, plugin2.pyå¹²äºå¥½å 件令人æå¥çäºã
é¦å
ï¼plugin1.pyåplugin2.pyéé¢çæ件类并没æ继æ¿èªinterfaces.Pluginï¼èplatformä»ç¶å¯ä»¥ç´æ¥è°ç¨å®ä»¬çstart()åstop()æ¹æ³ãè¿ä»¶äºå¨JavaãC++éé¢å¯è½æ¯ä»¶éº»ç¦çäºæ
ï¼ä½æ¯å¨Pythonéé¢å´æ¯ä»¶ç¨ç平常çäºï¼ä»¿ä½åé¥åæ°´ä¸è¬æ£å¸¸ãäºå®ä¸ï¼è¿æ£æ¯Pythoné¼å±ç约å®ç¼ç¨ãPythonçæ件æ¥å£å议就åªè§å®äºread(), write(), close()å°æ°å 个æ¹æ³ãå¤æ°ä»¥æ件ä½ä¸ºåæ°çå½æ°é½å¯ä»¥ä¼ å
¥èªå®ä¹çæ件对象ï¼åªè¦å®ç°å
¶ä¸ä¸ä¸¤ä¸ªæ¹æ³å°±è¡äºï¼èä¸å¿
å®ç°ä¸ä¸ªä»ä¹FileInterfaceãå¦æé£æ ·çè¯ï¼éè¦å®ç°çå½æ°å°±å¤äºï¼å¯è½è¦æåå 个ã
åä»ç»çä¸æ¥ï¼getPluginClass()å¯ä»¥æç±»åå½æå¼è¿åãå
¶å®ä¸æ¢æ¯ç±»åï¼Pythonçå½æ°ã模åé½å¯ä»¥è¢«å½ææ®éç对象使ç¨ãä»ç±»åçæä¸ä¸ªå®ä¾ä¹å¾ç®åï¼ç´æ¥è°ç¨clazz()å°±å建ä¸ä¸ªå¯¹è±¡ãä¸ä»
å¦æ¤ï¼Pythonè¿è½å¤ä¿®æ¹ç±»åãä¸é¢çä¾åæ们就æ¼ç¤ºäºå¦ä½ç»Platformå¢å ä¸ä¸ªæ¹æ³ãå¨ä¸¤ä¸ªæ件çstop()éé¢æ们é½è°ç¨äºsayGoodbye()ï¼ä½æ¯ä»ç»è§å¯Platformçå®ä¹ï¼éé¢å¹¶æ²¡æå®ä¹ãåçå°±å¨è¿éï¼
#plugins2.pydef sayGoodbye(self, from_):
print "goodbye from %s." % from_class Plugin2:
def setPlatform(self, platform):
self.platform=platform
if platform is not None:
platform.__class__.sayGoodbye=sayGoodbye
è¿éé¦å
éè¿platform.__class__å¾å°Platformç±»åï¼ç¶åPlatform.sayGoodbye=sayGoodbyeæ°å¢äºä¸ä¸ªæ¹æ³ã使ç¨è¿ç§æ¹æ³ï¼æ们å¯ä»¥è®©æ件任æä¿®æ¹æ ¸å¿çé»è¾ãè¿æ£å¨æé¦æ说çPythonå®ç°æ件å¼ç»æççµæ´»æ§ï¼æ¯éæè¯è¨å¦C++ãJavaçæ æ³æ¯æçãå½ç¶ï¼è¿åªæ¯æ¼ç¤ºï¼æä¸å¤§å»ºè®®ä½¿ç¨è¿ç§æ¹å¼ï¼å®æ¹åäºæ ¸å¿çAPIï¼å¯è½ä¼ç»å
¶å®ç¨åºåé æå°æãä½æ¯å¯ä»¥éç¨è¿ç§æ¹å¼æ¿æ¢åæ¥çæ¹æ³ï¼è¿å¯ä»¥å©ç¨âé¢ååé¢ç¼ç¨âï¼å¢å¼ºç³»ç»çåè½ã
æ¥ä¸æ¥æ们è¿è¦åæ¹è¿ä¸ä¸è½½å
¥æ件çæ¹æ³ï¼æè
说æ件çå¸ç½²æ¹æ³ãåé¢æ们å®ç°çæ件ä½ç³»ä¸»è¦ç缺ç¹æ¯æ¯ä¸ªæ件åªè½æä¸ä¸ªæºä»£ç ãå¦ææ³é带ä¸äºå¾çã声é³æ°æ®ï¼åæå®ä»¬ä¼åå
¶å®çæ件å²çªãå³ä½¿ä¸å²çªï¼ä¸è½½æ¶åæåç¬çæ件ä¹ä¸æ¹ä¾¿ãæ好æ¯æä¸ä¸ªæ件å缩æä¸ä¸ªæ件ä¾ä¸è½½å®è£
ã
Firefoxæ¯ä¸ä¸ªæ¯ææ件çèå软件ãå®çæ件以.xpiä½ä¸ºæ©å±åï¼å®é
ä¸æ¯ä¸ä¸ª.zipæ件ï¼éé¢å
å«äºjavascript代ç ãæ°æ®æ件çå¾å¤å
容ãå®ä¼ææ件å
ä¸è½½å¤å¶å¹¶è§£åå°%APPDATA%\Mozilla\Firefox\Profiles\XXXX.default\extensionséé¢ï¼ç¶åè°ç¨å
¶ä¸çinstall.jså®è£
ãä¸æ¤ç±»ä¼¼ï¼å®ç¨çPythonç¨åºä¹ä¸å¤§å¯è½åªæä¸ä¸ªæºä»£ç ï¼ä¹è¦åFirefoxé£æ ·æ¯æ.zipå
æ ¼å¼ã
å®ç°ä¸ä¸ªç±»ä¼¼äºFirefoxé£æ ·çæ件å¸ç½²ä½ç³»å¹¶ä¸ä¼å¾é¾ï¼å 为Pythonæ¯æ读å.zipæ件ï¼åªè¦åå è¡ä»£ç æ¥åå缩ä¸è§£å缩就è¡äºãé¦å
è¦çä¸ä¸zipfileè¿ä¸ªæ¨¡åãç¨å®è§£å缩ç代ç å¦ä¸ï¼
import zipfile, osdef installPlugin(filename):
with zipfile.ZipFile(filename) as pluginzip:
subdir=os.path.splitext(filename)[0]
topath=os.path.join("plugins", subdir)
pluginzip.extractall(topath)
ZipFile.extractall()æ¯Python 2.6åæ°å¢çå½æ°ãå®ç´æ¥è§£åææå缩å
å
çæ件ãä¸è¿è¿ä¸ªå½æ°åªè½ç¨äºåä¿¡ä»»çå缩å
ãå¦æå缩å
å
å
å«äºä»¥/æè
ç符å¼å§çç»å¯¹è·¯å¾ï¼å¾æå¯è½ä¼æåç³»ç»ãæ¨èçä¸ä¸zipfile模åç说æææ¡£ï¼äºå
è¿æ»¤éæ³çè·¯å¾åã
è¿éåªæ解å缩çä¸å°æ®µä»£ç ï¼å®è£
è¿ç¨ççé¢äº¤äºç¸å
³ç代ç å¾å¤ï¼ä¸å¯è½å¨è¿é举ä¾è¯´æãæè§å¾UIæ¯é常èéªè½¯ä»¶è®¾è®¡å¸çé¨åã常è§ç软件ä¼è¦æ±ç¨æ·å°ç½ç«ä¸æ¥æ¾å¹¶ä¸è½½æ件ãèFirefoxåKDEæä¾äºä¸ä¸ªâç»ä»¶(é¨ä»¶)管ççé¢âï¼ç¨æ·å¯ä»¥ç´æ¥å¨çé¢å
æ¥æ¾æ件ï¼æ¥çå®çæè¿°ï¼ç¶åç´æ¥ç¹å»å®è£
ãå®è£
åï¼æ们çç¨åºéåæ件ç®å½ï¼è½½å
¥ææçæ件ãä¸è¬å°ï¼è½¯ä»¶è¿éè¦åç¨æ·æä¾æ件çå¯ç¨ãç¦ç¨ãä¾èµçåè½ï¼çè³å¯ä»¥è®©ç¨æ·ç´æ¥å¨è½¯ä»¶çé¢ä¸ç»æ件è¯åï¼è¿éå°±ä¸å详述äºã
æ个å°æå·§ï¼å®è£
å°plugins/subdirä¸çæ件å¯ä»¥éè¿__file__å¾å°å®èªå·±çç»å¯¹è·¯å¾ãå¦æè¿ä¸ªæ件带æå¾çã声é³çæ°æ®çæ¶åï¼å¯ä»¥å©ç¨è¿ä¸ªåè½è½½å
¥å®ä»¬ãæ¯å¦ä¸é¢çplugin1.pyè¿ä¸ªæ件ï¼å¦æå®æ³å¨å¯å¨çæ¶åææ¾åç®å½çmessage.wavï¼å¯ä»¥è¿æ ·åï¼
#plugins1.pyimport osdef alert():
soundFile=os.path.join(os.path.dirname(__file__), "message.wav")
try:
import winsound
winsound.PlaySound(soundFile, winsound.SND_FILENAME)
except (ImportError, RuntimeError):
passclass Plugin1:
def setPlatform(self, platform):
self.platform=platform
def start(self):
self.platform.sayHello("plugin1")
alert()
def stop(self):
self.platform.sayGoodbye("plugin1")def getPluginClass():
return Plugin1
æ¥ä¸æ¥æ们åä»ç»ä¸ç§Python/Javaè¯è¨å¸¸ç¨çæ件管çæ¹å¼ãå®ä¸éè¦äºå
æä¸ä¸ªæ件解åè¿ç¨ï¼å 为Pythonæ¯æä».zpæ件导å
¥æ¨¡åï¼å¾ç±»ä¼¼äºJavaç´æ¥ä».jaræ件载å
¥ä»£ç ãæè°å®è£
ï¼åªè¦ç®åå°ææ件å¤å¶å°ç¹å®çç®å½å³å¯ï¼Python代ç èªå¨æ«æ并ä».zipæ件å
è½½å
¥ä»£ç ãä¸é¢æ¯ä¸ä¸ªæç®åçä¾åï¼å®åä¸é¢çå 个ä¾åä¸æ ·ï¼å
å«ä¸ä¸ªmain.pyï¼è¿æ¯ä¸»ç¨åºï¼ä¸ä¸ªpluginsåç®å½ï¼ç¨äºåæ¾æ件ãæ们è¿éåªæä¸ä¸ªæ件ï¼å为plugin1.zipãplugin1.zipæ以ä¸ä¸¤ä¸ªæ件ï¼å
¶ä¸description.txtä¿åäºæ件å
çå
¥å£å½æ°åæ件çååçä¿¡æ¯ï¼èplugin1.pyæ¯æ件ç主è¦ä»£ç :
description.txt
plugin1.py
å
¶ä¸description.txtçå
容æ¯:
[general]name=plugin1description=Just a test code=plugin1.Plugin1
plugin1.pyä¸åé¢çä¾å类似ï¼ä¸ºäºçäºï¼æ们å»æäºstop()æ¹æ³ï¼å®çå
容æ¯:
class Plugin1:
def setPlatform(self, platform):
self.platform=platform
def start(self):
self.platform.sayHello("plugin1")
éåçmain.pyçå
容æ¯:
# -*- coding: utf-8 -*-import os, zipfile, sys, ConfigParserclass Platform:
def __init__(self):
self.loadPlugins()
def sayHello(self, from_):
print "hello from %s." % from_
def loadPlugins(self):
for filename in os.listdir("plugins"):
if not filename.endswith(".zip"):
continue
self.runPlugin(filename)
def runPlugin(self, filename):
pluginPath=os.path.join("plugins", filename)
pluginInfo, plugin = self.getPlugin(pluginPath)
print "loading plugin: %s, description: %s" % \ (pluginInfo["name"], pluginInfo["description"])
plugin.setPlatform(self)
plugin.start()
def getPlugin(self, pluginPath):
pluginzip=zipfile.ZipFile(pluginPath, "r")
description_txt=pluginzip.open("description.txt")
parser=ConfigParser.ConfigParser()
parser.readfp(description_txt)
pluginInfo={}
pluginInfo["name"]=parser.get("general", "name")
pluginInfo["description"]=parser.get("general", "description")
pluginInfo["code"]=parser.get("general", "code")
sys.path.append(pluginPath)
moduleName, pluginClassName=pluginInfo["code"].rsplit(".", 1)
module=__import__(moduleName, fromlist=[pluginClassName, ])
pluginClass=getattr(module, pluginClassName)
plugin=pluginClass()
return pluginInfo, pluginif __name__=="__main__":
platform=Platform()
ä¸åä¸ä¸ªä¾åç主è¦ä¸åä¹å¤æ¯getPlugin()ãå®é¦å
ä».zipæ件å
读åæè¿°ä¿¡æ¯ï¼ç¶åæè¿ä¸ª.zipæ件添å å°sys.pathéé¢ãæåä¸åé¢ç±»ä¼¼å°å¯¼å
¥æ¨¡å并æ§è¡ã
解åè¿æ¯ä¸è§£åï¼ä¸¤ç§æ¹æ¡åæä¼å£ãä¸è¬å°ï¼æ.zipæ件解åå°ç¬ç«çæ件夹å
éè¦ä¸ä¸ªè§£å缩è¿ç¨ï¼æè
æ¯äººå·¥è§£åï¼æè
æ¯ç±è½¯ä»¶è§£åã解ååçè¿è¡æçä¼é«ä¸äºãèç´æ¥ä½¿ç¨.zipå
çè¯ï¼åªéè¦è®©ç¨æ·ææ件å¤å¶å°ç¹å®çä½ç½®å³å¯ï¼ä½æ¯æ¯æ¬¡è¿è¡çæ¶åé½éè¦å¨å
åéé¢è§£å缩ï¼æçéä½ãå¦å¤ï¼ä».zipæ件读åæ°æ®æ»æ¯æ¯è¾éº»ç¦ãæ¨èä¸å
å«æ²¡ææ°æ®æ件çæ¶å使ç¨ã
é
读å
¨æ
温馨提示:答案为网友推荐,仅供参考