将f2py与distutils混合使用

3 投票
1 回答
702 浏览
提问于 2025-04-17 13:20

我有一个叫“trees”的Python包,其中有一个myscript.py文件,这个文件使用了一个Fortran的子程序。

通常,我会用下面的命令来编译这个Fortran模块:

f2py -c -m calctree calctree.f90

然后我可以这样做:

from trees import myscript
myscript.mysub()

这时候就会用到calctree.so这个文件。

如果我通过运行下面的命令,用distutils把所有东西打包:

python ./setup.py sdist

那么setup.py文件的内容是:

#! /usr/bin/env python
from distutils.core import setup

setup(name='trees',
      version='0.1',
    packages=['trees']
    )

我在MANIFEST.in文件中指定了“include trees/calctree.f90”,这样我可以把.f90文件包含进来,但我不知道怎么让它在用户的电脑上用f2py编译,并把.so文件放到合适的位置。有人能帮忙吗?

谢谢!

1 个回答

1

你想使用numpy.distutils.core模块,它有自己的一套设置函数。你的setup.py文件应该像下面这样写(假设Fortran文件放在一个叫做trees的文件夹里),

import numpy.distutils.core
import setuptools


# setup fortran 90 extension
#---------------------------------------------------------------------------  
ext1 = numpy.distutils.core.Extension(
    name = 'calctree',
    sources = ['trees/calc_tree.f90'],
    )


# call setup
#--------------------------------------------------------------------------
numpy.distutils.core.setup( 

    name = 'trees',
    version = '0.1',        
    packages = setuptools.find_packages(), 
    package_data = {'': ['*.f90']}, 
    include_package_data = True,   
    ext_modules = [ext1],

)  

这至少是一个开始。

撰写回答