Python Numpy distutils无法识别Fortran文件类型

Python Numpy distutils无法识别Fortran文件类型,python,numpy,fortran,distutils,Python,Numpy,Fortran,Distutils,我正试图用Anaconda3编写一个python包,其中包括一些编译过的Fortran库。基于在线给出的示例,我需要使用numpy.distutils.core.Extension来正确构建扩展。以下是我的最小工作示例目录: MANIFEST.in setup.py bin └─── test_smat mypkg ├─── __init__.py ├─── compiled | ├─── __init__.py | └─── gaussian.f90 └─── py

我正试图用Anaconda3编写一个python包,其中包括一些编译过的Fortran库。基于在线给出的示例,我需要使用
numpy.distutils.core.Extension
来正确构建扩展。以下是我的最小工作示例目录:

MANIFEST.in
setup.py
bin
 └─── test_smat
mypkg
 ├─── __init__.py
 ├─── compiled
 |     ├─── __init__.py
 |     └─── gaussian.f90
 └─── pystuff
       ├─── __init__.py
       └─── buildmat.py
MANIFEST.in
中包含:

recursive-include mypkg *.f90
from setuptools import find_packages
from setuptools import setup
from numpy.distutils.core import Extension


ext_modules = [
    Extension('mypkg.compiled.gaussian',
              sources=['mypkg/compiled/gaussian.f90'])
               ]


setup(
    name='mypkg',
    version='0.1',
    description='This should work',
    packages=find_packages(),
    scripts=['bin/test_smat'],
    install_requires=['numpy>=1.7.0'],
    ext_modules = ext_modules
      )
"""                                                                         
Module for building matrices of Gaussian properties                         
"""                                                                         
import numpy as np                                                          
import mypkg.compiled.gaussian as gaussian                                  


def olap_matrix(x, a):                                                      
    """Builds an overlap matrix from a set of positions and widths."""      
    ngauss = len(x)                                                         
    Smat = np.empty((ngauss, ngauss))                                       

    for i in range(ngauss):                                                 
        for j in range(ngauss):                                             
            Smat[i,j] = gaussian.overlap(x[i], x[j], a[i], a[j])            

    return Smat
#!/usr/bin/env python                                                       
"""                                                                         
Script to test Python modules depending on Fortran libraries.               
"""                                                                         
import mypkg.pystuff.buildmat as buildmat                                   


def main():                                                                 
    """The main routine."""                                                 
    x = [-1, -0.9, -0.5, -0.1, 0.0, 0.0001, 0.001, 0.01, 0.1]               
    a = [1.2, 0.8, 0.3, 1.5, 3.2, 0.9, 0.8, 0.1, 1.6]                       
    mat = buildmat.olap_matrix(x, a)                                        

    print(mat)                                                              


if __name__ == '__main__':                                                  
    main()
setup.py
包含:

recursive-include mypkg *.f90
from setuptools import find_packages
from setuptools import setup
from numpy.distutils.core import Extension


ext_modules = [
    Extension('mypkg.compiled.gaussian',
              sources=['mypkg/compiled/gaussian.f90'])
               ]


setup(
    name='mypkg',
    version='0.1',
    description='This should work',
    packages=find_packages(),
    scripts=['bin/test_smat'],
    install_requires=['numpy>=1.7.0'],
    ext_modules = ext_modules
      )
"""                                                                         
Module for building matrices of Gaussian properties                         
"""                                                                         
import numpy as np                                                          
import mypkg.compiled.gaussian as gaussian                                  


def olap_matrix(x, a):                                                      
    """Builds an overlap matrix from a set of positions and widths."""      
    ngauss = len(x)                                                         
    Smat = np.empty((ngauss, ngauss))                                       

    for i in range(ngauss):                                                 
        for j in range(ngauss):                                             
            Smat[i,j] = gaussian.overlap(x[i], x[j], a[i], a[j])            

    return Smat
#!/usr/bin/env python                                                       
"""                                                                         
Script to test Python modules depending on Fortran libraries.               
"""                                                                         
import mypkg.pystuff.buildmat as buildmat                                   


def main():                                                                 
    """The main routine."""                                                 
    x = [-1, -0.9, -0.5, -0.1, 0.0, 0.0001, 0.001, 0.01, 0.1]               
    a = [1.2, 0.8, 0.3, 1.5, 3.2, 0.9, 0.8, 0.1, 1.6]                       
    mat = buildmat.olap_matrix(x, a)                                        

    print(mat)                                                              


if __name__ == '__main__':                                                  
    main()
gaussian.f90
包含(编辑:简化):

buildmat.py
包含:

recursive-include mypkg *.f90
from setuptools import find_packages
from setuptools import setup
from numpy.distutils.core import Extension


ext_modules = [
    Extension('mypkg.compiled.gaussian',
              sources=['mypkg/compiled/gaussian.f90'])
               ]


setup(
    name='mypkg',
    version='0.1',
    description='This should work',
    packages=find_packages(),
    scripts=['bin/test_smat'],
    install_requires=['numpy>=1.7.0'],
    ext_modules = ext_modules
      )
"""                                                                         
Module for building matrices of Gaussian properties                         
"""                                                                         
import numpy as np                                                          
import mypkg.compiled.gaussian as gaussian                                  


def olap_matrix(x, a):                                                      
    """Builds an overlap matrix from a set of positions and widths."""      
    ngauss = len(x)                                                         
    Smat = np.empty((ngauss, ngauss))                                       

    for i in range(ngauss):                                                 
        for j in range(ngauss):                                             
            Smat[i,j] = gaussian.overlap(x[i], x[j], a[i], a[j])            

    return Smat
#!/usr/bin/env python                                                       
"""                                                                         
Script to test Python modules depending on Fortran libraries.               
"""                                                                         
import mypkg.pystuff.buildmat as buildmat                                   


def main():                                                                 
    """The main routine."""                                                 
    x = [-1, -0.9, -0.5, -0.1, 0.0, 0.0001, 0.001, 0.01, 0.1]               
    a = [1.2, 0.8, 0.3, 1.5, 3.2, 0.9, 0.8, 0.1, 1.6]                       
    mat = buildmat.olap_matrix(x, a)                                        

    print(mat)                                                              


if __name__ == '__main__':                                                  
    main()
test\u smat
包含:

recursive-include mypkg *.f90
from setuptools import find_packages
from setuptools import setup
from numpy.distutils.core import Extension


ext_modules = [
    Extension('mypkg.compiled.gaussian',
              sources=['mypkg/compiled/gaussian.f90'])
               ]


setup(
    name='mypkg',
    version='0.1',
    description='This should work',
    packages=find_packages(),
    scripts=['bin/test_smat'],
    install_requires=['numpy>=1.7.0'],
    ext_modules = ext_modules
      )
"""                                                                         
Module for building matrices of Gaussian properties                         
"""                                                                         
import numpy as np                                                          
import mypkg.compiled.gaussian as gaussian                                  


def olap_matrix(x, a):                                                      
    """Builds an overlap matrix from a set of positions and widths."""      
    ngauss = len(x)                                                         
    Smat = np.empty((ngauss, ngauss))                                       

    for i in range(ngauss):                                                 
        for j in range(ngauss):                                             
            Smat[i,j] = gaussian.overlap(x[i], x[j], a[i], a[j])            

    return Smat
#!/usr/bin/env python                                                       
"""                                                                         
Script to test Python modules depending on Fortran libraries.               
"""                                                                         
import mypkg.pystuff.buildmat as buildmat                                   


def main():                                                                 
    """The main routine."""                                                 
    x = [-1, -0.9, -0.5, -0.1, 0.0, 0.0001, 0.001, 0.01, 0.1]               
    a = [1.2, 0.8, 0.3, 1.5, 3.2, 0.9, 0.8, 0.1, 1.6]                       
    mat = buildmat.olap_matrix(x, a)                                        

    print(mat)                                                              


if __name__ == '__main__':                                                  
    main()
理想情况下,我应该能够使用
python setup.py install安装并运行
test\u smat
以获得打印输出。但是,当我尝试安装时,我得到:

running install                                                             
running bdist_egg                                                           
running egg_info                                                            
writing mypkg.egg-info/PKG-INFO                                             
writing dependency_links to mypkg.egg-info/dependency_links.txt             
writing requirements to mypkg.egg-info/requires.txt                         
writing top-level names to mypkg.egg-info/top_level.txt                     
reading manifest file 'mypkg.egg-info/SOURCES.txt'                          
reading manifest template 'MANIFEST.in'                                     
writing manifest file 'mypkg.egg-info/SOURCES.txt'                          
installing library code to build/bdist.linux-x86_64/egg                     
running install_lib                                                         
running build_py                                                            
creating build                                                              
creating build/lib.linux-x86_64-3.6                                         
creating build/lib.linux-x86_64-3.6/mypkg                                   
copying mypkg/__init__.py -> build/lib.linux-x86_64-3.6/mypkg               
creating build/lib.linux-x86_64-3.6/mypkg/pystuff                           
copying mypkg/pystuff/buildmat.py -> build/lib.linux-x86_64-3.6/mypkg/pystuff
copying mypkg/pystuff/__init__.py -> build/lib.linux-x86_64-3.6/mypkg/pystuff
creating build/lib.linux-x86_64-3.6/mypkg/compiled                          
copying mypkg/compiled/__init__.py -> build/lib.linux-x86_64-3.6/mypkg/compiled
running build_ext                                                           
building 'mypkg.compiled.gaussian' extension                                
C compiler: gcc -pthread -B /home/rymac/.anaconda3/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC

error: unknown file type '.f90' (from 'mypkg/compiled/gaussian.f90')

我是否遗漏了告诉NumPy distutils扩展名是Fortran 90文件的内容?该网站上的其他示例似乎有一个
setup.py
文件,该文件同样简单,没有遇到此错误。将Fortran扩展名更改为
.f95
.f
会导致相同类型的错误。

问题在于尝试使用
setuptools.setup
numpy.distils.core.extension
Extension
的numpy版本包含有关
f2py
的附加信息,这些信息未包含在
setuptools.Extension
中,但只有在同时使用
numpy.distutils.core.setup
时,才能用于构建Fortran库


解决方案:在
setup.py

中,将setuptools import setup
中的
替换为numpy.distutils.core import setup中的
?我很确定有一个函数名为has\u f90c
,你可以调用它来检查。)哎呀,它是
have\u f90c
,而不是
has
。请参阅。假设f2py看到的环境与numpy的其余部分相同,那么它应该是。我可以使用
f2py-c-m gaussian-gaussian.f90
就地编译
gaussian.f90
,但这正是我们需要排除的假设。f2py可以找到f90编译器,但numpy distutils无法找到。如果是这样,那就是我们需要调试的。如果没有,我们就必须到别处去寻找问题。如果你只是添加电话,看看它说什么,我们会知道一种或另一种方法。如果你解决了原来的问题,现在有一个完全不同的问题,不要把它变成一个完全不同的问题。如果你认为答案对其他人有用的话,你可以写下来接受答案(尽管你可以很好地解释,但我相信你可以),或者要求关闭这个答案。然后就你的新问题写一个新问题。