Python是純粹的自由軟件, 源代碼和解釋器CPython遵循 GPL(GNU General Public License)協議。Python語法簡潔清晰,特色之一是強制用空白符(white space)作為語句縮進。
Python具有豐富和強大的庫。它常被昵稱為膠水語言,能夠把用其他語言制作的各種模塊(尤其是C/C++)很輕松地聯結在一起。常見的一種應用情形是,使用Python快速生成程序的原型(有時甚至是程序的最終界面),然后對其中有特別要求的部分,用更合適的語言改寫,比如3D游戲中的圖形渲染模塊,性能要求特別高,就可以用C/C++重寫,而后封裝為Python可以調用的擴展類庫。需要注意的是在您使用擴展類庫時可能需要考慮平臺問題,某些可能不提供跨平臺的實現。
matlab調用Python的腳本文件
matlab把所有參數輸出到一個文件里,然后用system命令調python腳本。python腳本讀文件做計算結果再寫文件。最后matlab再讀文件得到結果。假設python腳本的用法是:
python xxx.py in.txt out.txt
則matlab調用的命令:
[status, cmdout] = system(‘python xxx.py in.txt out.txt’)
Matlab的system函數用來向操作系統發送一條指令,并得到控制臺的輸出,可以直接將控制臺的輸出在Command Window打印出來,或者保存在變量中。 與system類似的還有dos函數和unix函數,我覺得它們都是對system函數的一種包裝,而Matlab的system函數也許是對C的庫函數system的包裝。
先編寫一個調用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
%這是一個在Matlab路徑中的可用的文件
if isempty(dir(thisArg))
%得到完整路徑
thisArg = which(thisArg);
end
elseif i==1
% 第一個參數是Python文件 - 必須是一個可用的文件
error([‘Unable to find Python file: ’, thisArg]);
end
% 如果thisArg中有空格,就用雙引號把它括起來
if any(thisArg == ‘ ’)
thisArg = [‘“’, thisArg, ‘”’];
end
% 將thisArg加在cmdString后面
cmdString = [cmdString, ‘ ’, thisArg]
end
%發送命令
[status,result]=system(cmdString);
end
就可以用這個函數調用python腳本了。 下面就來個調用python腳本matlab_readlines.py(保存在matlab當前目錄)的例子
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])
這個腳本用來讀取一個文本文件,并生成Matlab風格的cell數組的定義字符串,每個單元為文本的一行。 放了一個測試用的文本文件test.txt在Matlab的Current Directory中,內容如下:
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如何調用python腳本文件的路徑
Python作為一個用途廣泛的語言,提供了不少用于操作目錄和文件路徑的方法。而Matlab雖然一開始是為了數學運算而設計的,但是同樣提供了不少操作路徑的函數,因為數學運算也少不了要和文件打交道。下面列出Matlab和Python中功能相同或相似的操作路徑的方法,相信對于需要同時使用Matlab和Python的技術人員而言,有一些的作用。下面的討論都是基于Python2.6.4和Matlab7.7。
(1) filesep - os.path.sep
filesep是Matlab的一個函數,用于返回當前平臺的目錄分隔符,Windows是,Linux是/。在Python中對應物為os.path.sep,但它不是一個函數,而是一個字符串。
(2) fullfile - os.path.join
Matlab函數fullfile用于將若干個字符串連接成一個完整的路徑,如Matlab幫助文檔中的例子:
f = fullfile(‘C:’, ‘Applications’, ‘matlab’, ‘myfun.m’)
f =
C:Applicationsmatlabmyfun.m
其在Python中的對應物為os.path.join函數,例如:
》》》 os.path.join(‘c:\’, ‘lab’, ‘test.py’)
‘c:\lab\test.py’
但是在Windows平臺下os.path.join和Matlab函數fullfile的行為有些許不同,例如,我們用上面Matlab例子中的路徑給os.path.join:
》》》 os.path.join(‘C:’, ‘Applications’, ‘matlab’, ‘myfun.m’)
‘C:Applications\matlab\myfun.m’
比較fullfile和os.path.join的結果,發現os.path.join的結果中C:后面沒有添加分隔符。這并不是os.path.join的bug,而是它考慮了Windows中C:與C:的區別:“C:”表示C盤,而“C:”表示當前目錄,例如
C:LAB》cd c:book
C:LABook》
和下面的例子是等效的:
C:LAB》cd 。ook
C:LABook》
(3) fileparts - os.path.split, os.path.splitext
Matlab函數filesep用于將一個完整的文件名分割為四個部分:路徑,文件名,擴展名,版本號。在Python中可以用os.path.split和os.path.splitext取得路徑,文件名,擴展名,至于版本號用哪個我不太清楚。
(4) pathsep - os.path.sep
Matlab函數pathsep返回當前平臺的路徑分隔符。Windows平臺為‘;’,Linux為‘:’。在Python中的對應物為os.pathsep,但它不是一個函數而是一個字符串。
(5) exist - os.path.exists
實際上Matlab函數exist和Python的os.path.exists有很大的不同。之所以放在一起,是因為它們都可以用于判斷目錄或者文件是否存在。Matlab函數exist的功能要復雜很多,不像os.paht.exists只返回True和False,exist函數的返回值為整數,不同的數值代表了不同的含義。詳情參閱Matlab help。
(6) which - inspect.getsourcefile
Matlab函數which可以通過一個函數或腳本名稱得到它的完整路徑。不僅如此,which還能處理函數重載的情況,例如:
》》 which abs(0)
built-in (D:ProgramMATLABR2008b oolboxmatlabelfun@doubleabs) % double method
》》 which abs(single(0))
built-in (D:ProgramMATLABR2008b oolboxmatlabelfun@singleabs) % single method
在Python中與之功能類似的函數是inspect.getsourcefile,例如:
》》》 import random
》》》 import inspect
》》》 inspect.getsourcefile(random)
‘D:\Program\Python26\lib\random.py’
Matlab函數isdir和Python的os.path.isdir都用于判斷一個路徑是否代表了一個目錄。
(8) dir - os.listdir
Matlab函數dir和os.listdir都用于列出一個目錄的內容,但兩者有區別。os.listdir的返回值為list類型,包含了目錄內文件和目錄的名稱,而Matlab函數dir的返回值為結構體數組類型,包含了如下的域:
name:文件或目錄的名稱;
date:修改日期
bytes:文件大小
isdir:是否是目錄
datenum:修改日期
詳細用法參考Matlab help。
(9) cd - os.chdir
Matlab函數cd用于切換當前工作目錄。Python中的對應物為os.chdir。IPython中可以直接用cd。
(10) pwd - os.getcwd
Matlab函數pwd返回當前工作目錄的路徑,Python中對應物為os.getcwd。在IPython中可直接用pwd。
評論
查看更多