【问题标题】:How to put my Python C-module inside package?如何将我的 Python C 模块放入包中?
【发布时间】:2012-10-03 03:25:56
【问题描述】:

我想在一个包下收集多个 Python 模块,因此它们不会从全局 Python 包和模块集中保留太多名称。但是我对用 C 编写的模块有疑问。

这是一个非常简单的示例,直接来自官方 Python 文档。您可以从这里在页面底部找到它:http://docs.python.org/distutils/examples.html

from distutils.core import setup
from distutils.extension import Extension
setup(name='foobar',
      version='1.0',
      ext_modules=[Extension('foopkg.foo', ['foo.c'])],
      )

我的 foo.c 文件是这样的

#include <Python.h>

static PyObject *
foo_bar(PyObject *self, PyObject *args);

static PyMethodDef FooMethods[] = {
    {
        "bar",
        foo_bar,
        METH_VARARGS,
        ""
    },
    {NULL, NULL, 0, NULL}
};

static PyObject *
foo_bar(PyObject *self, PyObject *args)
{
    return Py_BuildValue("s", "foobar");
}

PyMODINIT_FUNC
initfoo(void)
{
    (void)Py_InitModule("foo", FooMethods);
}

int
main(int argc, char *argv[])
{
    // Pass argv[0] to the Python interpreter
    Py_SetProgramName(argv[0]);

    // Initialize the Python interpreter.  Required.
    Py_Initialize();

    // Add a static module
    initfoo();

    return 0;
}

它可以正常构建和安装,但我无法导入 foopkg.foo!如果我将它重命名为“foo”,它会完美运行。

有什么想法可以让“foopkg.foo”工作吗?例如,将 C 代码中的 Py_InitModule() 中的“foo”更改为“foopkg.foo”并没有帮助。

【问题讨论】:

    标签: python setuptools python-module distutils


    【解决方案1】:

    foopkg文件夹中必须有__init__.py文件,否则Python无法识别为包。

    setup.py所在的位置创建一个foopkg文件夹,并在其中放置一个空文件__init__.py,并在packages添加一行setup.py

    from distutils.core import setup
    from distutils.extension import Extension
    setup(name='foobar',
          version='1.0',
          packages=['foopkg'],
          ext_modules=[Extension('foopkg.foo', ['foo.c'])],
          )
    

    【讨论】:

    • 成功了!谢谢 :) 虽然我仍然认为 Python 文档中应该提到这一点:/
    【解决方案2】:

    distutils will be deprecated since python 3.10 ,您可以使用 setuptools,它是 distutils 的增强替代品,因此您无需在 setup() 中传递 packages 参数。例如:

    from setuptools import setup, Extension
    setup(name='foobar',
          version='1.0',
          ext_modules=[Extension('foopkg.foo', ['foo.c'])],
          )
    

    然后构建并安装你的 C 扩展

    python /PATH/TO/setup.py install
    

    成功构建你的 C 扩展后,运行以下命令测试是否可以按预期导入:

    python -c "from foopkg import foo"
    

    [旁注] 关于setuptool 的另一件事是,您只需运行pip uninstall 即可卸载C 扩展包,例如:python -m pip uninstall foobar

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多