无法导入使用numpy.distutils编译的扩展

时间:2016-01-03 00:33:48

标签: python numpy distutils f2py python-extensions

我有一个项目目录结构:




  myproject /
 setup.py
的myproject /
编辑/
 ....
公用事业/
 ...
 find_inf.f90
  




项目中的所有文件都是python,除了我指出的一个fortran文件。现在,我可以使用 setuptools 来安装我的项目而没有fortran文件就好了,但要包含fortran文件我必须使用 numpy.distutils.core.Extension 。所以我有一个这样的设置文件:




 来自setuptools import find_packages
来自numpy.distutils.core import Extension

 ext1 = Extension(name ='myproject.find_inf',
 sources = ['myproject / utilities / find_inf.f90'],
 extra_f90_compile_args = [' -  fopenmp',],
 libraries = [ 'gomp'])

 if __name__ ==“__ main __”:
来自numpy.distutils.core import setup
 setup(name ='myproject',
 packages = find_packages(),
 package_data = {
 ......
},
 entry_points = {&# xA;'console_scripts':[....]
},

 ext_modules = [ext1]
)
  
&# xA;


这将在 site-packages 目录下创建并安装 myproject-2.0-py2.7-macosx-10.6-x86_64.egg 目录结构如下:




  myproject-2.0-py2.7-macosx-10.6-x86_64.egg
的myproject
编辑\
 find_inf.pyc
 find_inf.so.dSYM /
 find_inf.py
 find_inf.so *
 __init__.py
 __init __。pyc
  




所以我认为我应该可以从 myproject导入 find_inf 。但我不能!从myproject import find_inf 编写会产生导入错误。我做错了什么?





更新:





如果我有机会这个名字从 my project.find_inf find_inf 的扩展名,然后安装将扩展名直接放在 myproject-2.0-py2.7-macosx-10.6-x86_64中。蛋。如果那时我手动将的find_inf文件从那里移动到 myproject-2.0-py2.7-macosx-10.6-x86_64.egg / myproject ,那么我可以导入扩展名。我仍然无法理解这一点。我的setup.py中明显错误的是它没有将扩展放在正确的位置....





更新:&# xA;想出来。答案如下。




1 个答案:

答案 0 :(得分:0)

好的,想通了。 name=的{​​{1}}参数应为Extension

原因:所以问题是name=myproject.utilities.find_inf没有知道名为myproject.find_inf的包。设置的setup()参数获取包的名称(作为列表),packages=不在列表中,因为myproject下没有名为find_inf的目录(作为我的目录结构)问题显示)。 This answer为这个问题提供了重要的信息。为了将编译后的扩展放在适当的子包下,需要:

  1. 源目录结构中存在的子包
  2. myproject.find_inf文件应存在于这些包中,
  3. 必须将这些包的名称传递给__init__.py中的packages=参数。
  4. 即。仅仅在调用setup()时描述扩展层次结构是不够的。