python插件2,python插件安裝方法

本文目錄一覽:

如何設計插件式結構的程序,兼談Python語言

為了擴充軟件的功能,通常我們會把軟件設計成插件式結構。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\testpluginstree /f /a

卷 Data 的文件夾 PATH 列表

卷序列號為 ****-****

H:.

| main1.py

|

\—plugins

plugin1.py

plugin2.py

__init__.py

h:\projects\workon\testpluginsmain1.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\testpluginsmain.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文件讀取數據總是比較麻煩。推薦不包含沒有數據文件的時候使用。

閱讀全文

請推薦分享sublime text2 for python 的好用插件?

目前我安裝了以下幾個,andypython,

Python標準庫幫助提示插件

,就是當你不知道怎麼寫的時候,提供用法

sublimelinter

,sublimerope,

智能代碼插件

5框酷斃的python插件工具

工欲善其事必先利其器,一個好的工具能讓起到事半功倍的效果,Python社區提供了足夠多的優秀工具來幫助開發者更方便的實現某些想法,下面這幾個工具給我的工作也帶來了很多便利,推薦給追求美好事物的你。

5框酷斃的python插件工具

1、Python Tutor

Python Tutor 是由 Philip Guo 開發的一個免費教育工具,可幫助學生攻克編程學習中的基礎障礙,理解每一行源代碼在程序執行時在計算機中的過程。通過這個工具,教師或學生可以直接在 Web 瀏覽器中編寫 Python 代碼,並逐步可視化地運行程序。如果你不知道代碼在內存中是如何運行的,不妨把它拷貝到Tutor里可視化執行一遍,加深理解。

地址:

2、IPython

IPython 是一個 for Humans 的 Python 交互式 shell,用了它之後你就不想再用自帶的 Python shell 了,IPython 支持變量自動補全,自動縮進,支持 bash shell 命令,內置了許多實用功能和函數,同時它也是科學計算和交互可視化的最佳平台。在公眾號【Pyhon之禪】回復 「ipython」 獲取《IPython交互式編程和數據可視化教程》。

地址:

3、Jupyter Notebook

Jupyter Notebook 就像一個草稿本,能將文本注釋、數學方程、代碼和可視化內容全部組合到一個易於共享的文檔中,以 Web 頁面的方式展示。它是數據分析、機器學習的必備工具。在公眾號【Pyhon之禪】回復 「jupyter」 給你看一個基於 jupyter 寫的 Python 教程。

地址:

4、Anaconda

Python 雖好,可總是會遇到各種包管理和 Python 版本問題,特別是 Windows 平台很多包無法正常安裝,為了解決這些問題,Anoconda 出現了,Anoconda 包含了一個包管理工具和一個Python管理環境,同時附帶了一大批常用數據科學包,也是數據分析的標配。之前在公眾號有介紹過 Anaconda

地址:

6、Skulpt

Skulpt 是一個用 Javascript 實現的在線 Python 執行環境,它可以讓你輕鬆在瀏覽器中運行 Python 代碼。使用 skulpt 結合 CodeMirror 編輯器即可實現一個基本的在線Python編輯和運行環境。

地址:

python 中安裝了哪些插件

用 pip list即可。

(1)先到官方主頁下載壓縮包,解壓到一個指定目錄.然後在目錄下一般會看到類似”setup.py”這麼一個python文件,這時假如這個文件所在目錄為”D:\temp”

(2)打開cmd命令窗口,執行定位到”D:\temp”文件夾的命令,這時在命令窗口輸入如下命令

cd /d d:\temp

(3)然後執行python命令進行安裝,則繼續在當前命令窗口執行如下命令即可完成安裝

python setup.py install

怎樣在Netbeans中找python插件

1. 啟動NetBeans 7。

2.點擊Tools – Plugins

3.當插件列表打開時,點擊settings選項卡。

4.在settings選項卡中點擊add按鈕

5.輸入任意你想要的一個名字,這裡我輸入的是「Developer Updates」

6.在下面的URL一欄中輸入

然後點擊OK

7.這時插件列表將會得到更新,你可能要等待一會,然後點擊Available Plugins選項卡

8.這時在搜索框中輸入「Python」來找到Python插件,或者直接手動找尋也可以,選擇一個python插件然後點擊install即可。

如何在myeclipse中添加python插件

在myeclipse中添加python插件

1.打開myeclipse,依次點擊help-software updates-find and install

2.在彈出的窗口中選擇search for new features to install-next

3.new remote site,輸入name及URL

4.finish,開始下載所有相關文件,在verification中選擇install all,然後重啟MyEclipse

5.查看是否安裝成功,help-about myeclipse enterprise workbench-plig-in details

至此插件安裝完畢

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/287198.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-23 13:06
下一篇 2024-12-23 13:06

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論