① 安裝python 需要什麼插件
需要安裝Python平台和一個順手的代碼編輯器,Python平台2.6、2.7、3.0+的版本皆可,如果你在windows下代碼編輯器可以使用PyScripter、PythonWin、自帶的IDLE也行,但智能感不夠強,在Linux下,可以考慮Vim
② 確認Python的某個插件或模塊是否已安裝
pip 模塊可以查看
pip list 這個命令就可以了
③ 如何設計插件式結構的程序,兼談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\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 mole相當於__import__("mole"),from mole import func相當於__import__("mole", fromlist=["func"]),不過與想像有點不同,import package.mole相當於__import__("package.mole", fromlist=["mole"])。
如何調用插件一般有個約定。像我們這里就約定每個插件都實現一個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)
moleName, pluginClassName=pluginInfo["code"].rsplit(".", 1)
mole=__import__(moleName, fromlist=[pluginClassName, ])
pluginClass=getattr(mole, pluginClassName)
plugin=pluginClass()
return pluginInfo, pluginif __name__=="__main__":
platform=Platform()
與前一個例子的主要不同之處是getPlugin()。它首先從.zip文件內讀取描述信息,然後把這個.zip文件添加到sys.path裡面。最後與前面類似地導入模塊並執行。
解壓還是不解壓,兩種方案各有優劣。一般地,把.zip文件解壓到獨立的文件夾內需要一個解壓縮過程,或者是人工解壓,或者是由軟體解壓。解壓後的運行效率會高一些。而直接使用.zip包的話,只需要讓用戶把插件復制到特定的位置即可,但是每次運行的時候都需要在內存裡面解壓縮,效率降低。另外,從.zip文件讀取數據總是比較麻煩。推薦不包含沒有數據文件的時候使用。
閱讀全文
④ 分享!5個好用的Python工具
1、 IDLE
IDLE直譯過來就是集成開發與學習環境的意思,一般安裝 Python 時也會默認安裝 IDLE。每個語言都可以有自己的IDLE。它讓Python的入門變得簡單,對於沒什麼基礎的人寫就對了。它的主要功能包括Python shell 窗口(互動式解釋器)、跨平台(Windows、Linux、UNIX、Mac OS X)、智能縮進、代碼著色、自動提示、可以實現斷點提示、單步執行等調試功能的基本集成調試器。
2、 Scikit-learn
scikit-learn是一個建立在Scipy基礎上的用於機器學習的Python模塊。其中scikit-learn是最有名的,是開源的,任何人都可以免費地使用這個庫或者進行二次開發。它是一個非常強大的工具,能為庫的開發提供高水平的支持和嚴格的管理。它也得到了很多第三方工具的支持,有豐富的功能適用於各種用例。
3、Theano
Theano是一個較老牌和穩定的機器學習python庫之一,雖然目前使用的人數有所下降。但它畢竟是一個祖師級的存在,一定有它的優點所在。Theano基於Python擅長處理多維數組,屬於比較底層的框架,theano起初也是為了深度學習中大規模人工神經網路演算法的運算所設計,我們可利用符號化式語言定義想要的結果,支持GPU加速,非常適合深度學習Python。
4、Selenium
Selenium 是自動化的最佳工具之一。它屬於 Python 測試的自動化。它在 Web 應用程序中用於自動化框架。支持多款主流瀏覽器,提供了功能豐富的API介面,常被用作爬蟲工具。使用它可以用許多編程語言編寫測試腳本,包括Java、C#、python、ruby等。還可以集成 Junit 和 TestNG 等鈾工具來管理測試用例並生成報告。
5、Skulpt
Skulpt 是一個用 Javascript 實現的在線 Python 執行環境,完全依靠瀏覽器端模擬實現Python運行的工具。不需要任何預處理、插件或伺服器端支持,只需編寫python並重新載入即可。因為代碼完全是在瀏覽器中運行的,所以不用擔心伺服器崩潰的問題。
關於分享!5個好用的Python工具,環球青藤小編就和大家分享到這里了,學習是永無止境的,學習一項技能更是受益終身,所以,只要肯努力學,什麼時候開始都不晚。如果您還想繼續了解關於python編程的學習方法及素材等內容,可以點擊本站其他文章學習。
⑤ 怎麼在eclipse安裝python模塊
方法/步驟
下載python的插件,在網路搜索eclipse python插件 下載,就相關版本,或者直接到python插件進行下載。
下載完成之後,解壓文件,把文件features內容復制到,eclipse的features下,把文件plugins內容復制到,eclipse的plugins下。
啟動eclipse
在eclipse在菜單中點擊【windows】》》preferences
在preferences找到pydev》》interpreter-python
在右上角點擊new》》在interpreter name輸入名稱,在interpreter ececutable為時python.exe的路徑
顯示如圖python插件環境配置,開始python的之旅
⑥ 如何使用pycharm添加python模塊
下載安裝打開後會提示No Python interpreter selected,點擊Interpreter後面的…設置Python解釋器位置。
點擊右上角的綠色加號,就可以添加Python解釋器了。
窗口底部會提示Python package management tools not found。點擊Install 『setuptools』就可以了,需要注意的是,如果安裝setuptools提示編碼錯誤,則需要改mimetypes.py。
如果在Packages選項卡內看到pip和setuptools了,那就說明安裝配置成功了。
點擊右側的Install按鈕即可打開插件安裝窗口。
搜索插件名稱,選擇所需插件,最後點擊Install Package插件的安裝就完成啦
有些網友存在搜索不到插件的情況,原因可能是連接不上國外的默認源,這時候就需要添加一些國內的源。點擊Manage Repositories,添加諸如豆瓣的源等
插件的卸載和升級也非常簡單,回到Packages選項卡,列表裡有藍色箭頭的就代表此插件可升級,選擇插件,點擊Upgrade即可。如果要卸載則點擊Uninstall。
⑦ 分享!5種常用的Python工具
IDLE
在安裝Python時,默認也會安裝IDLE。這是最優秀的Python工具之一。它可以降低Python入門的門檻。它的主要功能包括Python Shell窗口(互動式解釋器)、自動補齊、高亮顯示語法以及基本的集成調試器。IDLE輕巧易用,方便學習。但是,它不適用於大型項目。許多程序員都將其作為最佳的Python工具。
Scikit-learn
Scikit-learn是數據科學最常使用的Python工具之一。這是一款為機器學習和數據科學而設計的Python工具。該工具主要用於處理分類、回歸、聚類、模型選擇以及預處理等任務。scikit-Learn最出色的功能是在測試數據集上執行基準測試時,表現出的驚人速度。因此,對於程序員和學生來說,Scikit-learn是最優秀的Python工具之一。
Theano
Theano是一款數據科學的Python工具,對於程序員和學生而言,這是一款非常可靠的工具。它是深度學習方面最好的Python工具,因此非常適合深度學習。Theano的設計主旨是用戶友好、模塊化、易於擴展,而且可以與Python配合使用。它能夠以最佳方式表達神經網路。Theano可以在TensorFlow和CNTK等流行的神經網路之上運行。
Selenium
Selenium是最佳的Python自動化工具之一。它適用於Python測試的自動化,常常用作Web應用程序的自動化框架。我們可以利用Selenium,通過許多編程語言(包括Java、C#、Python、ruby以及其他許多程序員和學生使用的語言)來編寫測試腳本。你還可以在Selenium中集成Junit和TestNG等工具,來管理測試用例並生成報告。
Test complete
Testcomplete是另一款非常出色的Python自動化工具。支持Web、移動和桌面自動化測試。更高級的應用需要獲得商業許可,而且它還可以幫助學生提高學業成績。Test complete還可以像機器人框架一樣執行關鍵字驅動的測試。它擁有最出色的錄制以及回放功能,非常實用。
關於分享!5種常用的Python工具,環球青藤小編就和大家分享到這里了,學習是永無止境的,學習一項技能更是受益終身,所以,只要肯努力學,什麼時候開始都不晚。如果您還想繼續了解關於python編程的學習方法及素材等內容,可以點擊本站其他文章學習。
⑧ 如何用 Python 給 Vim 寫插件
vim中執行python命令
在vim中可以使用py[thon] {stmt}來執行python語句{stmt},你可以用:python print "Hello World!"來驗證一下。
只能執行一條語句,沒什麼用,不是嗎?所以有更加強大的介面,語法如下:
py[thon] << {endmarker}
{script}
{endmarker}
<!-- more -->
這樣我們就可以執行python腳本{script}中的內容了。{endmarker}是一個標記符號,可以是任何內容,不過{endmarker}後面不能有任何的空白字元。看一個簡單的例子,假設下面代碼保存為script_demo.vim:
function! Foo()
python << EOF
class Foo_demo:
def __init__(self):
print 'Foo_demo init'
Foo_demo()
EOF
endfunction
那麼在vim中我們先用:source path_to_script/script_demo.vim來載入腳本,然後就可以用:call Foo()來運行python腳本了,整個過程如圖所示:
此外,我們還可以將python腳本放到一個單獨的.py文件中,然後用pyf[ile] {file}來運行python文件中的程序,要注意這里pyf[ile]後面的所有參數被看做是一個文件的名字。
vim模塊
我們已經可以在vim中執行python命令了,但是python怎麼獲取vim中的一些信息呢?比如說我想知道vim當前緩沖區一共有多少行內容,然後獲取最後一行的內容,用python該怎麼做呢?
於是vim提供了一個python模塊,有趣的是模塊名字就叫做vim,我們可以用它來獲取vim編輯器裡面的所有信息。上面問題用以下python腳本就可以解決了:
function! Bar()
python << EOF
import vim
cur_buf = vim.current.buffer
print "Lines: {0}".format(len(cur_buf))
print "Contents: {0}".format(cur_buf[-1])
EOF
endfunction
你可以自己載入腳本運行一下見證奇跡!上面代碼出現了vim.current.buffer,想必你已經從名字猜到了它的意思了,不過還是來詳細看下吧:
vim模塊中的常量
vim.buffers: 用來訪問vim中緩沖區的列表對象,可以進行如下操作:
:py b = vim.buffers[i] # Indexing (read-only)
:py b in vim.buffers # Membership test
:py n = len(vim.buffers) # Number of elements
:py for b in vim.buffers: # Iterating over buffer list
vim.windows: 用來訪問vim中窗口的列表對象,和vim.buffers支持的操作基本相。
vim.current: 用來訪問vim中當前位置的各種信息,比如:
vim.current.line
vim.current.buffer
vim.current.window
vim.current.tabpage
vim.current.range
vim.vvars: 類似字典的對象,用來存儲global(g:)變數或者vim(v:)變數。
還有其他的一些常量,這里不做敘述。注意這里的常量並不是真正意義上的常量,你可以重新給他們賦值。但是我們應該避免這樣做,因為這樣會丟失該常量引用的值。現在為止我們已經能獲取vim中數據,然後用python來對其進行操作,似乎完美了。
不過vim並沒有止步於此,它可是Stronger than Stronger!因為我們可以在python里使用vim強大的命令集,這樣就可以用python寫一些常用的批處理插件,看下面簡單的例子:
function! Del(number)
python << EOF
import vim
num = vim.eval("a:number")
vim.command("normal gg{0}dd".format(num))
vim.command("w")
EOF
endfunction
可以調用上面函數Del(n)用來刪除當前緩沖區前n行的內容(只是示例而已,現實中別這么做!)上面用到了eval和command函數,如下:
vim模塊中兩個主要的方法
vim.command(str): 執行vim中的命令str(ex-mode,命令模式下的命令),返回值為None,比如:
:py vim.command("%s/aaa/bbb/g")
也可以用`vim.command("normal "+str)`來執行normal模式下的命令,比如說用以下命令刪除當前行的內容:
:py vim.command("normal "+'dd')
vim.eval(str): 用vim內部的解釋器來計算str中的內容,返回值可以是字元串、字典、或者列表,比如計算12+12的值:
:py print vim.eval("12+12")
將返回結算結果24。
前面的Del函數還提供了一個number參數,在vimL裡面可以通過let arg=a:number來使用,在python中通過vim.eval("a:number")來使用。也可以通過參數位置來訪問,比如let arg=a:0或者是vim.eval("a:0")。我們可以使用"..."來代替命名參數來定義一個能接收任意數量參數的函數,不過這樣只能通過位置來訪問。
vim模塊還提供了一個異常處理對象vim.error,使用vim模塊時一旦出現錯誤,將會觸發一個vim.error異常,簡單的例子如下:
try:
vim.command("put a")
except vim.error:
# nothing in register a
vim模塊提供的對象
到這里你基本能用python來對緩沖區進行基本的操作,比如刪除行或者是在指定行添加內容等。不過在緩沖區添加內容會很不pythoner,因為你得使用command來調用vim的i/I/a/A命令。好在有更科學的方式,那就是利用vim模塊提供的對象來進行操作,看下面簡單的例子:
function! Append()
python << EOF
import vim
cur_buf = vim.current.buffer
lens = len(cur_buf)
cur_buf.append('" Demo', lens)
EOF
endfunction
Append函數在當前緩沖區的結尾添加註釋內容" Demo,緩沖區對象是怎麼一會兒事呢?
緩沖區對象
vim模塊提供了緩沖區對象來讓我們對緩沖區進行操作,該對象有兩個只讀屬性name和number,name為當前緩沖區文件的名稱(包含絕對路徑),number為緩沖區的數量。還有一個bool屬性valid,用來標識相關緩沖區是否被擦除。
緩沖區對象有以下幾種方法:
b.append(str): 在當前行的下面插入新的行,內容為str;
b.append(str, n): 在第n行的下面插入新的行,內容為str;
b.append(list)
b.append(list, n): 插入多行到緩沖區中;
b.range(s,e): 返回一個range對象表示緩沖區中s到e行的內容。
注意使用append添加新行str時,str中一定不能包含換行符"\n"。str結尾可以有"\n",但會被忽略掉。
緩沖區對象的range方法會返回一個range對象來代表部分的緩沖區內容,那麼range對象又有那些屬性以及方法呢?
其實在操作上range對象和緩沖區對象基本相同,除了range對象的操作均是在指定的區域上。range對象有兩個屬性start和end,分別是range對象的起始和結尾行。它的方法有r.append(str),r.append(str,
n)和r.append(list),r.append(list, n)。
我們可以通過vim.windows來獲取vim中的窗口對象,我們只能通過窗口對象的屬性來對其進行操作,因為它沒有提供方法或者其他介面來操作。其中只讀屬性有buffer、number、tabpage等,讀寫屬性有cursor、height、width、valid等。具體可以查看幫助:h python-window
⑨ C程序用Python做插件該怎麼實現
Python 是一種用於快速開發軟體的編程語言,它的語法比較簡單,易於掌握,但存在執行速度慢的問題,並且在處理某些問題時存在不足,如對計算機硬體系統的訪問,對媒體文件的訪問等。而作為軟體開發的傳統編程語言 C 語言,卻能在這些問題上很好地彌補 Python 語言的不足。因此,本文通過實例研究如何在 Python 程序中整合既有的 C 語言模塊,包括用 C 語言編寫的源程序和動態鏈接庫等,從而充分發揮 Python 語言和 C 語言各自的優勢。
概覽
背景知識介紹
Python 語言的特點
Python 作為一門程序開發語言,被越來越多地運用到快速程序開發。Python 是一種解釋型的,互動的,面向對象的編程語言,它包含了模塊化的操作,異常處理,動態資料形態,以及類型的使用。它的語法表達優美易讀,具有很多優秀的腳本語言的特點:解釋的,面向對象的,內建的高級數據結構,支持模塊和包,支持多種平台,可擴展。而且它還支持互動式方式運行,圖形方式運行。它擁有眾多的編程界面支持各種操作系統平台以及眾多的各類函數庫,利用 C 和 C++ 可以對它進行擴充。
C 語言的特點
C 語言作為最受人們歡迎的語言之一,有廣泛的發展基礎。簡潔緊湊、靈活方便,功能強大是其特點。另外,C 語言是一門中級語言。它把高級語言的基本結構和語句與低級語言的實用性結合起來。由於可以直接訪問物理地址,可以方便的對硬體進行操作。因此,很多的系統軟體都是由 C 語言編寫。
Python 語言與 C 語言的交互
為了節省軟體開發成本,軟體開發人員希望能夠縮短的軟體的開發時間,希望能夠在短時間內開發出穩定的產品。Python 功能強大,簡單易用,能夠快速開發應用軟體。但是由於 Python 自身執行速度的局限性,對性能要求比較高的模塊需要使用效率更高的程序語言進行開發,例如 C 語言,系統的其他模塊運用 Python 進行快速開發,最後將 C 語言開發的模塊與 Python 開發的模塊進行整合。在此背景下,基於 Python 語言與 C 語言的各自特點,用 C 語言來擴展現有的 Python 程序,顯得很有意義。本文首先介紹幾種常用的整合 Python 程序與 C 語言程序的方法,最後給出相應的實例。
利用 ctypes 模塊整合 Python 程序和 C 程序
ctypes 模塊
ctypes 是 Python 的一個標准模塊,它包含在 Python2.3 及以上的版本里。ctypes 是一個 Python 的高級外部函數介面,它使得 Python 程序可以調用 C 語言編譯的靜態鏈接庫和動態鏈接庫。運用 ctypes 模塊,能夠在 Python 源程序中創建,訪問和操作簡單的或復雜的 C 語言數據類型。最為重要的是 ctypes 模塊能夠在多個平台上工作,包括 Windows,Windows CE,Mac OS X,Linux,Solaris,FreeBSD,OpenBSD。
接下來通過幾個簡單的例子來看一下 ctypes 模塊如何整合 Python 程序和 C 程序。
源代碼層面上的整合
利用 Python 本身提供的 ctypes 模塊可以使 Python 語言和 C 語言在源代碼層面上進行整合。本節介紹了如何通過使用 ctypes 庫,在 Python 程序中可以定義類似 C 語言的變數。
下表列出了 ctypes 變數類型,C 語言變數類型和 Python 語言變數類型之間的關系:
表 1. ctypes,c 語言和 Python 語言變數類型關系