我正在尝试为领域中一些热门的Fortran代码制作一个Python包分发。 我希望它使用最标准的方法,即 setup.py
文件。 该相关问题对学习如何包装Fortran扩展非常有帮助。
在使用此方法时,当混合使用setuptools
和numpy.distutils
时,我注意到了一些令人困惑的行为。 混合使用两者是否是不良实践?截至2015年,似乎尽可能使用setuptools
更可取。
但是,我想以与numpy
兼容的方式构建Fortran
扩展。 因此,我想从numpy.distutils
导入以获取Extension
和setup
。
我使用以下基本方法:
from setuptools.command.develop import develop
from numpy.distutils.core import Extension, setup
ext_modules=[Extension("my_package.fortran_mod", sources=['src/fortran_mod.f'])]
class MyDevelop(develop):
def run(self):
my_script()
develop.run(self)
setup(
...
ext_modules=ext_modules,
cmdclass={'develop':MyDevelop})
这似乎能够工作,但我有一些问题。
- 通常混合使用
setuptools
和numpy.distribute
是一个好的实践吗? - 我导入它们的顺序是否很重要?我应该总是先导入
setuptools
吗? - 是否有官方的最新教程来打包扩展到
numpy
?也许其中还包括一些关于 Fortran 扩展的讨论?
一些链接
https://www.youtube.com/watch?v=R4yB-8tB0J0
http://www.fortran90.org/src/best-practices.html#interfacing-with-python
nogil
非常重要。你的MPI示例是释放GIL的完美时机! - BeRecursivectypes
访问您的Fortran函数(只需注意函数名称,这取决于您的编译器,会得到一个尾随下划线)。最近我成为了pybind11的粉丝,它允许您从C++编写整个Python模块,并带有额外的优势,即古老的Fortran代码获得了现代化的前端。 - Tom de Geus