导入用编译的扩展时出现问题numpy.distutils公司

2024-06-16 09:42:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个项目目录结构:

myproject/
  setup.py
  myproject/
     editors/
       ....
     utilities/
       ...
       find_inf.f90

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

^{pr2}$

这将在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
          editors\  
          find_inf.pyc
          find_inf.so.dSYM/  
          find_inf.py   
          find_inf.so*
          __init__.py  
          __init__.pyc

所以在我看来,我应该能够从myproject导入{}。但我不能!写入from myproject import find_inf会产生导入错误。我做错什么了?在

更新:

如果我碰巧将扩展名从my project.find_inf改为find_inf,那么安装程序会将扩展直接放入myproject-2.0-py2.7-macosx-10.6-x86_64.egg。如果我手动将find\u inf文件从那里移动到myproject-2.0-py2.7-macosx-10.6-x86_64.egg/myproject,那么我就可以导入扩展名了。我还是搞不懂。我的设置.py它没有把分机放在正确的位置。。。。在

更新: 明白了。请在下面回答。在


Tags: 文件项目py目录soeggmyprojectfind
1条回答
网友
1楼 · 发布于 2024-06-16 09:42:46

好吧,想清楚了。Extensionname=参数应该是name=myproject.utilities.find_inf。在

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

  1. 源目录结构中存在的那些子包
  2. __init__.py文件应该存在于这些包中,并且
  3. 这些包的名称必须传递给setup()中的packages=参数。在

也就是说,仅仅在调用Extension()中描述扩展层次结构是不够的。在

相关问题 更多 >