我正在使用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中删除额外的子模块层。
答案 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