Python Numpy distutils无法识别Fortran文件类型
我正试图用Anaconda3编写一个python包,其中包括一些编译过的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
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无法找到。如果是这样,那就是我们需要调试的。如果没有,我们就必须到别处去寻找问题。如果你只是添加电话,看看它说什么,我们会知道一种或另一种方法。如果你解决了原来的问题,现在有一个完全不同的问题,不要把它变成一个完全不同的问题。如果你认为答案对其他人有用的话,你可以写下来接受答案(尽管你可以很好地解释,但我相信你可以),或者要求关闭这个答案。然后就你的新问题写一个新问题。