在Python中打包遗留Fortran。可以使用setuptools和numpy.distutils吗?
我正在尝试为我所在领域的一些流行Fortran代码制作python包分发版。我希望它使用一个在Python中打包遗留Fortran。可以使用setuptools和numpy.distutils吗?,python,numpy,fortran,setuptools,f2py,Python,Numpy,Fortran,Setuptools,F2py,我正在尝试为我所在领域的一些流行Fortran代码制作python包分发版。我希望它使用一个setup.py文件的最标准方法。相关问题有助于学习 使用这种方法时,我注意到在混合setuptools和numpy.distutils时出现了一些令人困惑的行为。把这两者混在一起是不好的做法吗?截至2015年,似乎最好尽可能多地使用setuptools 但是,我想以一种与numpy兼容的方式构建Fortran扩展。因此我想从numpy.distutils导入以获得扩展和设置 我使用以下基本方法: fro
setup.py
文件的最标准方法。相关问题有助于学习
使用这种方法时,我注意到在混合setuptools
和numpy.distutils
时出现了一些令人困惑的行为。把这两者混在一起是不好的做法吗?截至2015年,似乎最好尽可能多地使用setuptools
但是,我想以一种与numpy兼容的方式构建Fortran
扩展。
因此我想从numpy.distutils
导入以获得扩展
和设置
我使用以下基本方法:
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扩展的讨论一些链接 这似乎有效,但我有问题
最近发布的是cleaner,它在一个可理解且干净的界面中自动生成所有必要的包装代码。它支持Fortran90之前的版本,但最适合Fortran90及更高版本。它可以用来生成一个干净的发行版以及python代码接口(假设用户安装了gfortran)。我不是编写Fortran代码的专家,但我对Cython很有经验。Scipy 2015中有一个关于成功包装Fortran代码的非常好的部分-我建议您看看!你所说的标准Python是什么意思<如果您希望能够将任务委托给本机代码并利用线程/多进程,则code>nogil非常重要。您的MPI示例是发布GIL的最佳时机@GIL与MPI有什么共同之处?MPI有单独的进程,所以锁不应该起作用。不过线程是不同的。与f2py相比,Cython允许您在Fortran代码中使用。因为f2py主要是为Fortran77代码构建的,所以它缺少很多Fortran90+功能,例如动态内存分配。有了Cython,您就有了更大的灵活性,因为您的Fortran和Cython代码可以使用iso_c_绑定彼此说话(几乎是本地的)。在前面的一些评论之后,我想为您的考虑提供另外两个选项。如果使用“旧”Fortran,则可以使用
ctypes
直接访问Fortran函数(只需注意函数名,根据编译器的不同,函数名后面会有下划线)。最近,我已经成为一个迷,它允许你从C++中写出整个Python模块,它的优点是古老的FORTRAN代码获得了一个现代的前端。个人项目插件不是问题,但是这个答案是。请您参考您在上述1,2,3中回答的问题,以便实际阅读此答案?