【发布时间】:2017-09-15 22:29:45
【问题描述】:
我想创建一个名为“mypack”的 Python 3 包,可以使用 pip 进行安装。它有一些 c 扩展和一些调用这些扩展的 python 代码。这是我的目录结构:
setup.py
mypack/__init__.py
mypack/mypack.py
foopkg/foo.cpp
setup.py 文件代码如下:
from setuptools import setup, Extension
PACKAGE_NAME = 'mypack'
module = Extension('foo',
language = "c++",
sources = ['foopkg/foo.cpp'])
setup(name=PACKAGE_NAME,
version='1.0',
packages=[PACKAGE_NAME],
ext_package=PACKAGE_NAME,
ext_modules=[module],
include_package_data=True)
我从另一个相关问题中改编了这段代码,在该问题中,用户想要像我一样使用mypack.xxx 之类的东西来导入扩展。在 c-api 扩展中,我已经成功编译它并使它作为一个独立的扩展模块工作,但是我无法将它合并到一个更大的包中。它定义了两个函数make_array 和print_array。为简洁起见,我删除了函数代码,只包含了 Python 需要的东西:
...
static PyMethodDef FooMethods[] = {
{ "make_array", make_array, METH_VARARGS, "Put number in array"},
{ "print_array", print_array, METH_VARARGS, "Print number from array"},
{ NULL, NULL, 0, NULL}
};
static struct PyModuleDef foomodule = {
PyModuleDef_HEAD_INIT,
"foo",
"Make/Print array",
-1,
FooMethods
};
PyMODINIT_FUNC PyInit_foo(void)
{
return PyModule_Create(&foomodule);
}
我希望能够在包中导入这个扩展来使用它(这是mypack.py):
import mypack.make_array
import mypack.print_array
def dostuff():
array = make_array(10)
print_array(array)
最后,我的__init__.py 文件包含from .mypack import dostuff。
但是,当我使用 pip 安装并尝试运行导入 mypack 的测试脚本时,无论我使用 foo.xx 还是 mypack.xx,它都会抱怨 mypack.py 中的导入。我已经构建了其他具有嵌套结构的包,这些包使用模块中其他 python 文件中的代码,使用 __init__.py 并使用导入。但是我对如何使用 c-extensions 做到这一点有点困惑。
【问题讨论】:
标签: python setuptools python-c-api python-c-extension