在 setup.py 和 link 中自动构建共享的 Fortran 库到 f2py
Automatically build shared fortran library in setup.py and link it to f2py
我正在寻找生成 setup.py
文件的最佳方法,该文件基于 Fortran 例程构建我的程序包。
Package/Module结构
.
├── CHANGES.txt
├── LICENSE.txt
├── MANIFEST.in
├── README.md
├── PKG
│ ├── __init__.py
│ ├── lib
│ │ ├── __init__.py
│ │ ├── xx.f90
│ │ ├── yy.f90
│ │ ├── gg.py
│ ├── dirA
│ │ ├── __init__.py
│ │ ├── ee.py
│ │ ├── bb.py
├── setup.py
手动编译 Fortran 的文件
为了生成 Python 包装器并编译 Fortran 文件,我可以使用以下工作流程(在文件夹 lib 中)来完成:
gfortran -fPIC -Wall -fcheck=all --shared xx.f90 -o xx.o
[1]
和
f2py -c -m yy yy.f90 xx.o
前一行确保共享库xx.o
和库`yy.f90.
之间的链接
请注意 f2py -c -m xx xx.f90
不起作用,因为使用了一些不能用于 f2py 的语法(在子例程中使用可分配参数...)。
当前 setup.py
(不工作)
我用的是numpy.distutils
的Extension
模块:
import os
from numpy.distutils.core import setup, Extension
#
pkgs['PKG'] = 'PKG'
pkgs['PKG.lib'] = 'PKG/lib'
pkgs['PKG.dirA'] = 'PKG/dirA'
#
exts = list()
exts.append(
Extension(name='PKG.lib.yy',
sources=['PKG/lib/yy.f90','PKG/lib/xx.o'],
extra_compile_args=['-g','--backtrace'],
extra_link_args=[],
f2py_options=['--debug-capi']))
###
###
setup(name = 'PKG',
ext_modules = exts,
packages = list(pkgs.keys()),
package_dir = pkgs,
include_package_data=True,
zip_safe=False
)
问题
有什么办法可以在setup.py
中集成共享库的构建?一种解决方案是 运行 手动 [1] 行,但如果可能的话,我想避免使用我自己的语法,以便使用 f2py
.[=24= 使用的相同 gfortran 编译器和选项。 ]
最后的解决方案是在扩展和设置中使用 library
/libraries
参数:
import os
from numpy.distutils.core import setup, Extension
#
pkgs['PKG'] = 'PKG'
pkgs['PKG.lib'] = 'PKG/lib'
pkgs['PKG.dirA'] = 'PKG/dirA'
#
exts = list()
exts.append(
Extension(name='PKG.lib.yy',
sources=['PKG/lib/yy.f90'],
extra_compile_args=['-g','--backtrace'],
extra_link_args=[],
libraries=['xx'],
f2py_options=['--debug-capi']))
###
###
setup(name = 'PKG',
ext_modules = exts,
packages = list(pkgs.keys()),
package_dir = pkgs,
libraries=['xx',sources=['PKG/lib/xx.f90']],
include_package_data=True,
zip_safe=False
)
另一个解决方案使用 Configuration
from numpy.distutils.core import setup
from numpy.distutils.misc_util import Configuration
config = Configuration('PKG')
config.packages=['PKG','PKG.lib']
config.add_extension('lib.yy',
sources=['PKG/lib/MeshField2D.f90'],
libraries=['xx'])
config.add_library('xx',
sources=['PKG/lib/xx.f90'])
setup(**config.todict())
我正在寻找生成 setup.py
文件的最佳方法,该文件基于 Fortran 例程构建我的程序包。
Package/Module结构
.
├── CHANGES.txt
├── LICENSE.txt
├── MANIFEST.in
├── README.md
├── PKG
│ ├── __init__.py
│ ├── lib
│ │ ├── __init__.py
│ │ ├── xx.f90
│ │ ├── yy.f90
│ │ ├── gg.py
│ ├── dirA
│ │ ├── __init__.py
│ │ ├── ee.py
│ │ ├── bb.py
├── setup.py
手动编译 Fortran 的文件
为了生成 Python 包装器并编译 Fortran 文件,我可以使用以下工作流程(在文件夹 lib 中)来完成:
gfortran -fPIC -Wall -fcheck=all --shared xx.f90 -o xx.o
[1]
和
f2py -c -m yy yy.f90 xx.o
前一行确保共享库xx.o
和库`yy.f90.
请注意 f2py -c -m xx xx.f90
不起作用,因为使用了一些不能用于 f2py 的语法(在子例程中使用可分配参数...)。
当前 setup.py
(不工作)
我用的是numpy.distutils
的Extension
模块:
import os
from numpy.distutils.core import setup, Extension
#
pkgs['PKG'] = 'PKG'
pkgs['PKG.lib'] = 'PKG/lib'
pkgs['PKG.dirA'] = 'PKG/dirA'
#
exts = list()
exts.append(
Extension(name='PKG.lib.yy',
sources=['PKG/lib/yy.f90','PKG/lib/xx.o'],
extra_compile_args=['-g','--backtrace'],
extra_link_args=[],
f2py_options=['--debug-capi']))
###
###
setup(name = 'PKG',
ext_modules = exts,
packages = list(pkgs.keys()),
package_dir = pkgs,
include_package_data=True,
zip_safe=False
)
问题
有什么办法可以在setup.py
中集成共享库的构建?一种解决方案是 运行 手动 [1] 行,但如果可能的话,我想避免使用我自己的语法,以便使用 f2py
.[=24= 使用的相同 gfortran 编译器和选项。 ]
最后的解决方案是在扩展和设置中使用 library
/libraries
参数:
import os
from numpy.distutils.core import setup, Extension
#
pkgs['PKG'] = 'PKG'
pkgs['PKG.lib'] = 'PKG/lib'
pkgs['PKG.dirA'] = 'PKG/dirA'
#
exts = list()
exts.append(
Extension(name='PKG.lib.yy',
sources=['PKG/lib/yy.f90'],
extra_compile_args=['-g','--backtrace'],
extra_link_args=[],
libraries=['xx'],
f2py_options=['--debug-capi']))
###
###
setup(name = 'PKG',
ext_modules = exts,
packages = list(pkgs.keys()),
package_dir = pkgs,
libraries=['xx',sources=['PKG/lib/xx.f90']],
include_package_data=True,
zip_safe=False
)
另一个解决方案使用 Configuration
from numpy.distutils.core import setup
from numpy.distutils.misc_util import Configuration
config = Configuration('PKG')
config.packages=['PKG','PKG.lib']
config.add_extension('lib.yy',
sources=['PKG/lib/MeshField2D.f90'],
libraries=['xx'])
config.add_library('xx',
sources=['PKG/lib/xx.f90'])
setup(**config.todict())