【问题标题】:How to package a Python C Extension such that it is a submodule of a normal Python module? [duplicate]如何打包 Python C 扩展,使其成为普通 Python 模块的子模块? [复制]
【发布时间】:2017-02-05 04:04:17
【问题描述】:

我写了一个python库,分两部分:

  1. Python C 扩展
  2. Python C 扩展的 Python 包装器

我希望能够以这样一种方式打包它,即 Python 包装器是顶级模块 foo,而 Python C 扩展是位于 foo._foo 的子模块。但是,到目前为止,我只能创建两个顶级模块,foo_foo

我需要在setup.pyinit_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


【解决方案1】:

正如链接问题中提到的,解决方案是将_foo更改为foo._foo

from distutils.core import setup, Extension

module = Extension('foo._foo',
                   sources=['foo.c'])

setup(name='foo', packages=['foo'], ext_modules=[module])

我的问题是我在与foo 模块所在的目录相同的目录中运行我的tests.py

我通过将其放入自己的目录来解决此问题:

/foo
    /foo
        __init__.py
    foo.c
    setup.py
    /tests
         test.py

【讨论】:

    猜你喜欢
    • 2018-07-20
    • 2011-03-31
    • 2018-10-12
    • 2020-09-09
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多