I am trying to make a python package distribution for some popular Fortran codes in my field. I want it to use the most standard approach with a setup.py
file. The related qustion was helpful for learning how to wrap Fortran extensions.
When using this approach, I noticed some confusing behavior when mixing setuptools
and numpy.distutils
. Is it bad practice to mix the two? As of 2015, it seems preferable to use setuptools
as much as possible.
However, I would like to build Fortran
extensions in a way that is compatible with numpy.
So I would like to import from numpy.distutils
to get Extension
and setup
.
I'm using the following basic approach:
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})
This seems to work but I have questions.
- Is it generally good practice to mix
setuptools
andnumpy.distribute
? - Does the order I import them matter? Should I always import
setuptools
first? - Is there an official up-to-date tutorial for packaging extensions to
numpy
? Perhaps even one with some discussion Fortran extensions?
Some links
https://www.youtube.com/watch?v=R4yB-8tB0J0
http://www.fortran90.org/src/best-practices.html#interfacing-with-python
This seems to work but I have questions.
- Is it generally good practice to mix setuptools and numpy.distribute?
- Does the order I import them matter? Should I always import setuptools first?
- Is there an official up-to-date tutorial for packaging extensions to numpy? Perhaps even one with some discussion Fortran extensions?
You should not need to use numpy.distribute anymore.
^^ Not necessary
Particularly for wrapping fortran code with numpy, there is the popular f2py. However I personally find the necessary code annotations redundant, because good fortran code contains all necessary information.
(warning personal project plug below)
Recently released is the cleaner fmodpy, which automatically generates all necessary wrapper code in an understandable and clean interface. It supports pre-Fortran90, but is best suited for Fortran90 and later. It could be used to generate a clean distribution along with the python interface of code (presuming users have gfortran installed).
来源:https://stackoverflow.com/questions/31388363/packaging-legacy-fortran-in-python-is-it-ok-to-use-setuptools-and-numpy-distuti