使用依赖于另一个fortran模块的fortran模块打包Python+f2py项目

2024-06-02 06:52:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试打包一个Python项目,它需要一个fortran模块module1.f90f2py。该模块依赖于另一个模块module2.f90,该模块不应f2py,但需要编译并链接到module1.f90。当然,使用gfortran+f2py可以运行一些简单的命令来实现这一点,但是我想设置一些东西,以便distutils.setup自动完成

下面是包结构。我需要编译后的库进入foo/foo/

foo/
|-- fortran/
|   |-- module1.f90
|   |-- module2.f90
|
|-- foo/
|   |-- __init__.py
|   |-- module1.cpython-36m-x86_64-linux-gnu.so should end up here
|
|-- setup.py

下面是我的setup.py的一部分:

import setuptools                                                                                                                                             
from numpy.distutils.core import setup, Extension 
setup(...
    ext_modules=[                                                                                                                                             
        Extension('foo.module1',                                                                                                                                
                  sources=['fortran/module1.f90'],                                                                                                  
                  libraries = [('module2', dict(sources=['fortran/module2.f90']))] )                                                                                          
    ],   
    ...)

但是,这最终会导致此类错误:

fortran/MODULE1.f90(6): error #7002: Error in opening the compiled module file.  Check INCLUDE paths.   [MODULE2]
  use module2

仔细查看构建目录,我们发现如下文件:

./build/temp.linux-x86_64-3.6/fortran/module2.o
./build/temp.linux-x86_64-3.6/libmodule2.a
./build/temp.linux-x86_64-3.6/module2.mod

请注意libmodule2.amodule2.mod最终位于根目录中。理想情况下,它们将以./build/temp.linux-x86_64-3.6/foo/结束,因为在编译过程中,该路径会自动包含在include路径中。之所以包含./build/temp.linux-x86_64-3.6/foo/而不是./build/temp.linux-x86_64-3.6/,是因为我指定的扩展名是foo.module1,而不是module1。这确保了setup.pymodule1.cpython-36m-x86_64-linux-gnu.so放在foo/foo/中,这对于此包结构的工作至关重要。我可以将扩展名更改为module1,这将允许成功编译,但是so文件将以foo/而不是foo/foo/结束

有没有一种方法可以(a)强制包含路径./build/temp.linux-x86_64-3.6/,而不必以特定于系统的方式指定它?或者(b)强制将需要链接的文件放到foo/foo/而不是foo/中?是否有其他可行的设置


Tags: 模块文件pybuildsofoolinuxsetup