Fermat618's Blog

Happy coding

Vim 的超级牛力--一次 debug 经历

Fermat618 posted @ 2014年6月04日 13:00 in 未分类 , 1313 阅读

Python 在数值计算方面,有一个非常好的功能,可以写一个 Fortran 程序,然后通过简单的 f2py 命令,便可变成一个 python 模块,以供在 python 里面调用。

 

在我用 f2py 把 Fortran 文件编译成 python 模块时,遇到一个奇怪的问题。当用其它的编辑器打开并修改  .f90 文件后,再使用 f2py 转到 python 模块,会发现模块里面的变量值没有更新。但当使用 vim 打开文件并保存后,就能得到正确的值。

 

刚开始,我以为是不同编辑器对修改时间可能有不同处理,影响到构建程序依赖关系得不到正确处理。所以,我改用了直接调用相关命令,而不依赖于 scons 的自动构建。但是,问题依然存在。

然后,我 又试了不同的编辑器,eclipse 的内置编辑器,nano, gedit, emacs 等,其它编辑器表现一至,除了 vim 比较特殊。

 

这个没办法了,我又拿出其查看访问时间与修改时间的东西,当编辑器保存完时,查看这两个时间,没发现 vim 和 其它编辑器有什么不同。

 

后来,我新建了个目录,把相关的文件放进去,终于发现,当有 .mod 文件存在时, f2py 会用原来的 .mod 文件,而不是生成新的 .mod 文件。

 

为什么 .mod文件能影响到 python 中 module 变量 的值呢,是因为我用了带 parameter 的变量,这样的参数会被写入到 .mod 文件,而不是 .o 文件。

 

后来的后来,我发现用 vim 修改了文件之后,python 模块中的变量值,变成了一个乱码。于是我又保存了老的 .mod 文件,再跟用 .vim 保存完 .f90 后的 .mod 文件相对比,果然,内容变了。

再仔细一看变了一部分,real 默认成了 real 8. 我喜欢用 -fdefault-real-8 来写 Fortran 程序,这样子,不用每次都写 real(8) 了,省事得多。这个参数需要手动指定,我在哪里指定了这个参数呢,SConstruct 中,但是那个文件不在当前目录,起不了作用。

终于的终于,我想起来了,在 vim 的插件 syntastic 的配置文件中,我指定了这个参数。由此,一切直相大白。synntastic 会在保存的时候,编译一遍当前文件,相获得语法错误,于是,就产生了新的 .mod 文件。

 

f2py 在这个地方没有问题么,也有。问题在于,它隐式的采用了一个中间文件,而没有任何的警告。这是不妥的,如果要采用那个文件,要么使用显式的命令行参数来指定,要么另外生成。就像在运行 gcc main.c foo.c 时,无论有没有 main.o 或 foo.o 存在,编译器都要新生成一个 .o, 因为命令行参数中指定的,不是 .o, 而是 .c.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter