无法在__init __。py

时间:2017-11-23 20:48:54

标签: python distutils f2py

我正在使用f2py包装一个fortran库,到目前为止,它已成功地使函数在python中工作

我正在构建我的包,并在使用这些__init__.py生成的模块时遇到f2py问题。这与使用distutils

f2py扩展名构建的包相关

安装鸡蛋后,在外部脚本中我可以直接导入f2py生成的模块

from package.core.module1 import fortran_fn

,但是当我放置

from module1 import fortran_fn
<{1>}中的

为了重构用户的命名空间,

包导入失败

package/core/__init__.py

然而,有一个例外,无论出于何种原因,一个模块特别希望自己导入。

项目结构:

----> 1 import package.core as core
~/venv/dev/lib/python3.5/site-packages/package-py3.5-linux-x86_64.egg/package/core/__init__.py in <module>()
      1 
      2
----> 3 from module1 import fortran_fn
      4
      5 

ImportError: No module named 'module1'
使用setup.py package/ __init__.py core/ __init__.py module1.pyf module2.pyf ... src/ lib/ module1.f module2.f ...

生成

*pyf

此外,

f2py -h package/core/moduleX.pyf src/lib/moduleX.f -m moduleX

#core/__init__.py 

from module1 import fortran_fn

简化代码示例以说明问题,具体代码可在this github

获得

在某些情况下,我最初尝试#setup.py from setuptools import find_packages from numpy.distutils.core import Extension ext1 = Extension(name='package.core.module1', sources=['package/core/module1.pyf', 'src/lib/module1.f']) #ext2 = ... # and others setup (name="package", packages = find_packages(), ext_modules = [ ext1 ]) # ..., ext2, ... ] 直接将fortran放入f2py子包,方法是使用.core进行编译,将-m package.core用于扩展,但是name='package.core'会抱怨缺少姓名。

在这个特定的结构中有一个额外的层,其中每个fortran模块只是一个函数,我想从API中删除额外的子模块层。

2 个答案:

答案 0 :(得分:1)

core/__init__.py中使用完全限定名称可解决即时导入问题。

而不是:

#core/__init__.py

from module1 import fortran_fn

这将有效:

#core/__init__.py

from package.core.module1 import fortran_fn

然后

> import package.core as c
> c.fortran_fn()
 SUCCESS

f2py运行时,distutils扩展名似乎未注册为子包/子模块。我可能会错误地解释这个问题。

答案 1 :(得分:1)

在Python 3中,所有导入都是绝对的。要执行相对导入,请执行以下操作:

from .module1 import fortran_fn