【发布时间】:2021-01-06 18:13:33
【问题描述】:
我有一个用 C 编写的 python 模块,它有一个主模块和一个子模块(名称带有点,不确定这是否可以称为真正的子模块):
PyMODINIT_FUNC initsysipc(void) {
PyObject *module = Py_InitModule3("sysipc", ...);
...
init_sysipc_light();
}
static PyTypeObject FooType = { ... };
PyMODINIT_FUNC init_sysipc_light(void) {
PyObject *module = Py_InitModule3("sysipc.light", ...);
...
PyType_Ready(&FooType);
PyModule_AddObject(module, "FooType", &FooType);
}
模块编译为sysipc.so,当我把它放在当前目录时,下面的导入没有问题:
import sysipc
import sysipc.light
from sysipc.light import FooType
问题是我想把这个模块放在一个命名空间包里面,文件夹结构是这样的:
company/
company/__init__.py
company/dept/
company/dept/__init__.py
company/dept/sys/
company/dept/sys/__init__.py
company/dept/sys/sysipc.so
所有三个__init__.py 只包括标准的setuptool 导入行:
__path__ = __import__('pkgutil').extend_path(__path__, __name__)
在当前目录中,以下导入不起作用:
from company.dept.sys import sysipc;
from company.dept.sys.sysipc.light import FooType;
在这种情况下我应该如何导入模块sysipc.light中定义的类型和方法?
====================================
更新实际错误:
我已经构建了sysipc.so,如果我在当前目录中运行 python 作为这个模块,导入将按预期工作:
[root@08649fea17ef 2]# python2
Python 2.7.18 (default, Jul 20 2020, 00:00:00)
[GCC 10.1.1 20200507 (Red Hat 10.1.1-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sysipc
>>> import sysipc.light
>>>
但是,如果我将其放入命名空间文件夹中,如下所示:
company/
company/__init__.py
company/dept
company/dept/__init__.py
company/dept/sys
company/dept/sys/sysipc.so
company/dept/sys/__init__.py
导入子模块将不起作用:
>>> from company.dept.sys import sysipc
>>> from company.dept.sys import sysipc.light
File "<stdin>", line 1
from company.dept.sys import sysipc.light
^
SyntaxError: invalid syntax
>>> from company.dept.sys.sysipc import light
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name light
>>>
该模块是用this simple code 构建的,它是为python2 构建的。我也有same example for python3。
【问题讨论】:
-
首先感谢您提出的好问题。看起来对我和我的工作很有见地。在这里,我的问题是你介意告诉你如何说“在导入之后没有问题”,比如
import sysipc,因为据我所知,我们将构建 C 文件并将其安装到我们想要的 python 模块中(而不是转换为.so) 并且可以在任何文件中调用。你能单独解释那部分吗?需要一些关于如何调整的信息? -
您能否在尝试导入模块时提供错误消息?我试图复制这个问题,但对我来说,导入工作正常(除了自动完成,因为我没有包含存根)
-
我已经用错误信息和示例代码更新了问题。
标签: python python-2.7 python-module python-c-api