By default, f2py prefers the GNU Fortran 77 compiler --fcompiler=gnu over the GNU Fortran 95 compiler --fcompiler=gnu95. If you have both g77 and gfortran on your path, then f2py will, use g77, which cannot build Fortran 90 extensions.
If you would prefer for numpy to use gfortran over g77, you can either pass the --fcompiler=gnu95 flag to setup.py when building your code, or you can modify your numpy installation's numpy/distutils/fcompiler/__init__.py file [*] from:
_default_compilers = (
# sys.platform mappings
('win32', ('gnu','intelv','absoft','compaqv','intelev','gnu95','g95',
'intelvem', 'intelem')),
('cygwin.*', ('gnu','intelv','absoft','compaqv','intelev','gnu95','g95')),
('linux.*', ('gnu','intel','lahey','pg','absoft','nag','vast','compaq',
'intele','intelem','gnu95','g95','pathf95')),
('darwin.*', ('nag', 'absoft', 'ibm', 'intel', 'gnu', 'gnu95', 'g95', 'pg')),
('sunos.*', ('sun','gnu','gnu95','g95')),
('irix.*', ('mips','gnu','gnu95',)),
('aix.*', ('ibm','gnu','gnu95',)),
# os.name mappings
('posix', ('gnu','gnu95',)),
('nt', ('gnu','gnu95',)),
('mac', ('gnu','gnu95','pg')),
)
to
_default_compilers = (
# sys.platform mappings
('win32', ('gnu95','intelv','absoft','compaqv','intelev','gnu','g95',
'intelvem', 'intelem')),
('cygwin.*', ('gnu95','intelv','absoft','compaqv','intelev','gnu','g95')),
('linux.*', ('gnu95','intel','lahey','pg','absoft','nag','vast','compaq',
'intele','intelem','gnu','g95','pathf95')),
('darwin.*', ('nag', 'absoft', 'ibm', 'intel', 'gnu95', 'gnu', 'g95', 'pg')),
('sunos.*', ('sun','gnu95','gnu','g95')),
('irix.*', ('mips','gnu95','gnu',)),
('aix.*', ('ibm','gnu95','gnu',)),
# os.name mappings
('posix', ('gnu95','gnu',)),
('nt', ('gnu95','gnu',)),
('mac', ('gnu95','gnu','pg')),
)
This will prioritize gfortran over g77, allowing you to build Fortran 90 extensions for your Python code using f2py.
[*] If you've never modified an installed Python module before, you will probably we wondering where to find it. From your Python prompt:
import numpy; print numpy.__file__