我有一个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识别例程,但这并不足以缩小它。