使用f2py

时间:2018-03-01 03:25:32

标签: python debugging fortran f2py

我有一个Fortran代码,我用f2py和Intel Fortran + Visual Studio编译成Python扩展。该代码具有完整的测试套件和五年的历史。但是,最近我一直在新机器上使用它,并且扩展已经崩溃了Python。是否会发生崩溃取决于Python中的import order和print语句之类的东西,所以我怀疑某种内存或堆栈问题。

如果我纯粹是用编译语言编写的,那么如果我使用完全优化编译但是构建符号,我通常会得到足够的信息。并启用运行时数组边界检查。

这个组合在f2py中是否可行?我该怎么做?

我的目录结构如下所示:

.
+-- setup.py
+-- lib
|   + hcclib.lib
|   + hcc.pyf
|   + hcc.for
+-- pyhcc
|   + __init__.py
|   + pyhcc.py 

我的setup.py看起来像这样:

from numpy.distutils.core import setup
from numpy.distutils.core import Extension

ext = Extension(name = '_hcc',
             sources = ['lib/hcc.pyf', 'lib/hcc.for'],
             extra_f77_compile_args=\
             ['/check:bounds','/Z7','/O2','/nopdbfile'],
             extra_compile_args=["/Z7"])

setup(name='PyHCC',
      version='1.0',
      description='Python Bindings for HCC',
      author='Me',
      author_email='me@domain.com',
      packages=['pyhcc'],
      package_dir = {'pyhcc':'pyhcc'},
      package_data={'pyhcc':['*.pyd','*.dll']},
      py_modules = ['pyhcc.__init__','pyhcc.py'],
      exclude_package_data = {'': ['*.pyc','*.pyo']},
      ext_modules = [ext]
     )

接口由pyhcc.py提供,它执行参数检查并调用_hcc中的扩展函数。

当我编译扩展时,将为fortran引发fortran编译器(ifort),并为c ++调用c ++编译器(cl)。我添加了extra_compile_args(由Pierre建议),但发现我需要将有问题的标志传递给C ++和Fortran,因此使用了extra_compile_args用于C和extra_f77_compile_args或extra_f90_compile_args用于Fortran(它被视为.for为f77)。根据构建的f2py部分期间的消息,似乎使用了标志。

发生崩溃时,我在命令行上没有收到任何消息。我收到了在visual studio中调试的消息框,但是当我说是的时,调试器没有说明符号。我不知道这是不是真的。有没有办法验证静态lib hcc.lib或输出pyd文件中是否存在符号?我该怎么办呢?崩溃本身似乎是一个段落错误。我可以捕获它并在python中使用faulthandler识别例程,但这并不足以缩小它。

0 个答案:

没有答案