【发布时间】:2017-02-05 04:04:17
【问题描述】:
我写了一个python库,分两部分:
- Python C 扩展
- Python C 扩展的 Python 包装器
我希望能够以这样一种方式打包它,即 Python 包装器是顶级模块 foo,而 Python C 扩展是位于 foo._foo 的子模块。但是,到目前为止,我只能创建两个顶级模块,foo 和 _foo。
我需要在setup.py 和init_foo C 函数中做什么才能完成此操作?
(我的问题与this略有不同)
当前目录结构:
foo/
foo/
__init__.py
foo.c
setup.py
tests.py
setup.py 看起来像:
from distutils.core import setup, Extension
module = Extension('_foo',
sources=['foo.c'])
setup(name='foo', packages=['foo'], ext_modules=[module])
foo.c 看起来像:
PyMODINIT_FUNC init_foo(void) {
PyObject *m;
m = Py_InitModule("_foo", FooMethods);
// ..
}
int main(int argc, char *argv[]) {
Py_SetProgramName(argv[0])
Py_Initialize();
init_pychbase();
}
foo/__init__.py 看起来像:
from _foo import _Foo, _Bar, _Baz
class Foo(object):
def __init__(self):
self._foo = _Foo()
【问题讨论】:
-
@MatthewMoisen 你说“(我的问题与this有细微的不同)”你能解释一下为什么吗?
-
@MSeifert 在再次尝试之后,我现在意识到它并没有足够的不同来保证一个新的问题。 (不同之处在于我希望我的 c 扩展深一层,而 OP 想要他的两层深)。我的问题是我的
tests.py文件与 foo 模块位于同一目录中,因此当我运行它时导入已关闭。创建tests/tests.py设置解决了这个问题。
标签: python python-2.7 python-c-api python-c-extension