Vim、Python、Matlab互相调用
Vim,Python,Matlab之间有6=3*2中关系。我们这里只说,vim调Python, vim调matlab, python调matlab三种情况。vim可以编辑.py,和.m文件,也有语法高亮。如果能在编辑完文档后按个什么键,就能执行程序是在好不过的了。matlab强是强在科学计算,矩阵计算,但是它的数据结构很单一,字符串处理上稍显不足。因此python调用matlab的情况也是有可能的。python毕竟是一样很强大的语言。(官网上通篇英语,确有两个汉字“下载”)!
1. Vim调用Python
从最简单的说吧。vim执行python代码,极其简单。
:py+{python代码},执行python2的代码。(+与{}不用输入)
:py3+{python代码},执行python3的代码。(+与{}不用输入)这种方式适合写只有一行的代码,也非常适合在编写vim插件时引用python代码。
:pyfile+{xxx.py}, 执行python的代码,代码写在文件中。(+与{}不用输入)
:py3file+{xxx.py}, 执行python3的代码。(+与{}不用输入)
因此,编译当前的.py文件只需要输入:py3file+文件名 即可。每次打这几个字也挺反的,统一起见就用“,r”来执行代码。(和之前的文章中提到的用vim编译tex时的按键设成一样)代码如下:
map <silent> <buffer> ,r :w<CR>:py3file %<CR><silent><buffer><cr><cr></cr></cr></buffer></silent>
存在$vim\vimfiles\ftplugin\python.vim中,这其实就是filetype-plugin,因此打开.py以后按“,r”和打开.tex以后按“,r”,执行的代码是不同的。代码中%表示的就是现在编辑的文件的完整路径。<CR>表示回车。这里其实有两个命令,保存和编译。
2. Python调用Matlab
在这里,我们要用到matlab的com。所以Python需要用到win32com.client模块。木有的话,就要下载一下了。(我用的是python 3,谢天谢地,这个模块在3里也能用)。我们这里举一个简单的例子。
import win32com.client try: h=win32com.client.GetActiveObject('matlab.desktop.application') except: h=win32com.client.Dispatch('matlab.desktop.application') h.Execute("f=8;") print(h.GetVariable("f","base")
这个地方try和catch的作用主要是,如果已经有了一个matlab的server的话,就去用那个Server。'matlab.desktop.application'这里主要是开matlab的完整版窗口。如果不想开完整版,可以用'matlab.application'开command window。这里有一个问题。如果你是先通过双击桌面上的图标开matlab的话,在执行这个程序会在开一个窗口。
其实,python不光可以连matlab,用这种方法,word,ie,excel,access,iTunes统统可以连接。代码中h的方法,是需要到matlab里查的。所以如果你连到word,ie,excel,access的话,你要到微软家去查了。我这里用了两个方法,一个是Execute,顾名思义,就是执行代码的。另一个是GetVariable,是可以进行数据传输的,实行数据传输的含有其他函数,比如GetFullMatrix,PutFullMatrix等等。
如何用python调用.m文件,请看下节。
3. Vim调用Matlab
Vim调用.m文件,本质上就是用Python调用.m文件的。代码如下:
function! RunMatlab() py3 << EOF import win32com.client try: h=win32com.client.GetActiveObject('matlab.desktop.application') except: h=win32com.client.Dispatch('matlab.desktop.application') import vim h.Execute("temppath='"+vim.eval('expand("%:p:h")')+"'") h.Execute("cd(temppath)") h.Execute("clear temppath") h.Execute("rehash path") print (h.Execute(vim.eval('expand("%:t:r")'))) EOF endfunction if has("win32") && has("python3") map <silent> <buffer> ,r :w<CR>:call RunMatlab()<CR> endif
和前面一样用",r"调用函数。先保存在编译。由于是vim插件,所以用py3 << EOF {我的代码}EOF来执行多行python代码。注意第二个EOF前面不能有缩进。里面的python语句和上一节的差不多。不过在执行代码前,先修改了一下matlab的路径。在vim中执行python代码,可以用vim模块。vim.eval('expand("%:p:h")')就是输出当前编辑的文件所在文件夹的路径。
h.Execute("rehash path")这句话一开始,我没有加。结果导致了什么呢?就是当我修改了.m文件,再次编译时,matlab执行的仍旧是修改以前的代码。一开始我感到什么诡异,会不会是没保存呢?可是“,r”的第一个动作就是保存。后来才知道,要让matlab里的path refresh一下。
最后print (h.Execute(vim.eval('expand("%:t:r")')))。这样,就可以在VIm里面直接查看结果了。包括错误信息。
保存在$vim\vimfiles\ftplugin\matlab.vim中。当然这个代码的先决条件是要装了python3,python2也可以,只要把py3改成py就可以了。
原创文章,转载请注明: 转载自ELLY66
本文链接地址: Vim、Python、Matlab互相调用
文章的脚注信息由WordPress的wp-posturl插件自动生成
Evernote lets you save all the interesting things you see online into a single place. Access all those saved pages from your computer, phone or the web. Sign up now or learn more. It's free!