Python是純粹的自由軟件, 源代碼和解釋器CPython遵循 GPL(GNU General Public License)協(xié)議。Python語法簡潔清晰,特色之一是強(qiáng)制用空白符(white space)作為語句縮進(jìn)。
Python具有豐富和強(qiáng)大的庫。它常被昵稱為膠水語言,能夠把用其他語言制作的各種模塊(尤其是C/C++)很輕松地聯(lián)結(jié)在一起。常見的一種應(yīng)用情形是,使用Python快速生成程序的原型(有時(shí)甚至是程序的最終界面),然后對(duì)其中有特別要求的部分,用更合適的語言改寫,比如3D游戲中的圖形渲染模塊,性能要求特別高,就可以用C/C++重寫,而后封裝為Python可以調(diào)用的擴(kuò)展類庫。需要注意的是在您使用擴(kuò)展類庫時(shí)可能需要考慮平臺(tái)問題,某些可能不提供跨平臺(tái)的實(shí)現(xiàn)。
matlab調(diào)用Python的腳本文件
matlab把所有參數(shù)輸出到一個(gè)文件里,然后用system命令調(diào)python腳本。python腳本讀文件做計(jì)算結(jié)果再寫文件。最后matlab再讀文件得到結(jié)果。假設(shè)python腳本的用法是:
python xxx.py in.txt out.txt
則matlab調(diào)用的命令:
?。踫tatus, cmdout] = system(‘python xxx.py in.txt out.txt’)
Matlab的system函數(shù)用來向操作系統(tǒng)發(fā)送一條指令,并得到控制臺(tái)的輸出,可以直接將控制臺(tái)的輸出在Command Window打印出來,或者保存在變量中。 與system類似的還有dos函數(shù)和unix函數(shù),我覺得它們都是對(duì)system函數(shù)的一種包裝,而Matlab的system函數(shù)也許是對(duì)C的庫函數(shù)system的包裝。
先編寫一個(gè)調(diào)用Python腳本的matlab程序即python.m
function [result status] = python(varargin)
% call python
%命令字符串
cmdString=‘python’;
for i = 1:nargin
thisArg = varargin{i};
if isempty(thisArg) | ~ischar(thisArg)
error([‘All input arguments must be valid strings.’]);
elseif exist(thisArg)==2
%這是一個(gè)在Matlab路徑中的可用的文件
if isempty(dir(thisArg))
%得到完整路徑
thisArg = which(thisArg);
end
elseif i==1
% 第一個(gè)參數(shù)是Python文件 - 必須是一個(gè)可用的文件
error([‘Unable to find Python file: ’, thisArg]);
end
% 如果thisArg中有空格,就用雙引號(hào)把它括起來
if any(thisArg == ‘ ’)
thisArg = [‘“’, thisArg, ‘”’];
end
% 將thisArg加在cmdString后面
cmdString = [cmdString, ‘ ’, thisArg]
end
%發(fā)送命令
?。踫tatus,result]=system(cmdString);
end
就可以用這個(gè)函數(shù)調(diào)用python腳本了。 下面就來個(gè)調(diào)用python腳本matlab_readlines.py(保存在matlab當(dāng)前目錄)的例子
import sys
def readLines(fname):
try:
f=open(fname,‘r’)
li=f.read().splitlines()
cell=‘{’+repr(li)[1:-1]+‘}’
f.close()
print cell
except IOError:
print “Can‘t open file ”+fname
if ’__main__‘==__name__:
if len(sys.argv)《2:
print ’No file specified.‘
sys.exit()
else:
readLines(sys.argv[1])
這個(gè)腳本用來讀取一個(gè)文本文件,并生成Matlab風(fēng)格的cell數(shù)組的定義字符串,每個(gè)單元為文本的一行。 放了一個(gè)測試用的文本文件test.txt在Matlab的Current Directory中,內(nèi)容如下:
This is test.txt
It can help you test python.m
and matlab_readlines.py
測試:
在Matlab的Command Window中輸入:
》》 str=python(’matlab_readlines.py‘,’test.txt‘);
》》 eval([’c=‘ str])
c =
’This is test.txt‘ [1x29 char] [1x23 char]
》》 celldisp(c)
c{1} = This is test.txt
c{2} = It can help you test python.m
c{3} = and matlab_readlines.py
matlab如何調(diào)用python腳本文件的路徑
Python作為一個(gè)用途廣泛的語言,提供了不少用于操作目錄和文件路徑的方法。而Matlab雖然一開始是為了數(shù)學(xué)運(yùn)算而設(shè)計(jì)的,但是同樣提供了不少操作路徑的函數(shù),因?yàn)閿?shù)學(xué)運(yùn)算也少不了要和文件打交道。下面列出Matlab和Python中功能相同或相似的操作路徑的方法,相信對(duì)于需要同時(shí)使用Matlab和Python的技術(shù)人員而言,有一些的作用。下面的討論都是基于Python2.6.4和Matlab7.7。
?。?) filesep - os.path.sep
filesep是Matlab的一個(gè)函數(shù),用于返回當(dāng)前平臺(tái)的目錄分隔符,Windows是,Linux是/。在Python中對(duì)應(yīng)物為os.path.sep,但它不是一個(gè)函數(shù),而是一個(gè)字符串。
?。?) fullfile - os.path.join
Matlab函數(shù)fullfile用于將若干個(gè)字符串連接成一個(gè)完整的路徑,如Matlab幫助文檔中的例子:
f = fullfile(‘C:’, ‘Applications’, ‘matlab’, ‘myfun.m’)
f =
C:Applicationsmatlabmyfun.m
其在Python中的對(duì)應(yīng)物為os.path.join函數(shù),例如:
》》》 os.path.join(‘c:\’, ‘lab’, ‘test.py’)
‘c:\lab\test.py’
但是在Windows平臺(tái)下os.path.join和Matlab函數(shù)fullfile的行為有些許不同,例如,我們用上面Matlab例子中的路徑給os.path.join:
》》》 os.path.join(‘C:’, ‘Applications’, ‘matlab’, ‘myfun.m’)
‘C:Applications\matlab\myfun.m’
比較fullfile和os.path.join的結(jié)果,發(fā)現(xiàn)os.path.join的結(jié)果中C:后面沒有添加分隔符。這并不是os.path.join的bug,而是它考慮了Windows中C:與C:的區(qū)別:“C:”表示C盤,而“C:”表示當(dāng)前目錄,例如
C:LAB》cd c:book
C:LABook》
和下面的例子是等效的:
C:LAB》cd 。ook
C:LABook》
?。?) fileparts - os.path.split, os.path.splitext
Matlab函數(shù)filesep用于將一個(gè)完整的文件名分割為四個(gè)部分:路徑,文件名,擴(kuò)展名,版本號(hào)。在Python中可以用os.path.split和os.path.splitext取得路徑,文件名,擴(kuò)展名,至于版本號(hào)用哪個(gè)我不太清楚。
(4) pathsep - os.path.sep
Matlab函數(shù)pathsep返回當(dāng)前平臺(tái)的路徑分隔符。Windows平臺(tái)為‘;’,Linux為‘:’。在Python中的對(duì)應(yīng)物為os.pathsep,但它不是一個(gè)函數(shù)而是一個(gè)字符串。
(5) exist - os.path.exists
實(shí)際上Matlab函數(shù)exist和Python的os.path.exists有很大的不同。之所以放在一起,是因?yàn)樗鼈兌伎梢杂糜谂袛嗄夸浕蛘呶募欠翊嬖?。Matlab函數(shù)exist的功能要復(fù)雜很多,不像os.paht.exists只返回True和False,exist函數(shù)的返回值為整數(shù),不同的數(shù)值代表了不同的含義。詳情參閱Matlab help。
?。?) which - inspect.getsourcefile
Matlab函數(shù)which可以通過一個(gè)函數(shù)或腳本名稱得到它的完整路徑。不僅如此,which還能處理函數(shù)重載的情況,例如:
》》 which abs(0)
built-in (D:ProgramMATLABR2008b oolboxmatlabelfun@doubleabs) % double method
》》 which abs(single(0))
built-in (D:ProgramMATLABR2008b oolboxmatlabelfun@singleabs) % single method
在Python中與之功能類似的函數(shù)是inspect.getsourcefile,例如:
》》》 import random
》》》 import inspect
》》》 inspect.getsourcefile(random)
‘D:\Program\Python26\lib\random.py’
Matlab函數(shù)isdir和Python的os.path.isdir都用于判斷一個(gè)路徑是否代表了一個(gè)目錄。
(8) dir - os.listdir
Matlab函數(shù)dir和os.listdir都用于列出一個(gè)目錄的內(nèi)容,但兩者有區(qū)別。os.listdir的返回值為list類型,包含了目錄內(nèi)文件和目錄的名稱,而Matlab函數(shù)dir的返回值為結(jié)構(gòu)體數(shù)組類型,包含了如下的域:
name:文件或目錄的名稱;
date:修改日期
bytes:文件大小
isdir:是否是目錄
datenum:修改日期
詳細(xì)用法參考Matlab help。
?。?) cd - os.chdir
Matlab函數(shù)cd用于切換當(dāng)前工作目錄。Python中的對(duì)應(yīng)物為os.chdir。IPython中可以直接用cd。
?。?0) pwd - os.getcwd
Matlab函數(shù)pwd返回當(dāng)前工作目錄的路徑,Python中對(duì)應(yīng)物為os.getcwd。在IPython中可直接用pwd。
評(píng)論
查看更多