我正在尝试打包一个Python项目,它需要一个fortran模块module1.f90
来f2py
。该模块依赖于另一个模块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.a
和module2.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.py
将module1.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/
中?是否有其他可行的设置
目前没有回答
相关问题 更多 >
编程相关推荐