如何将我的Python C-module放入包中?

如何将我的Python C-module放入包中?,python,setuptools,python-module,distutils,Python,Setuptools,Python Module,Distutils,我希望在一个包中收集多个Python模块,这样它们就不会从Python包和模块的全局集合中保留太多的名称。但是我对用C编写的模块有问题 下面是一个非常简单的示例,直接来自官方Python文档。您可以在页面底部的以下位置找到它: 我的foo.c文件如下所示 #include <Python.h> static PyObject * foo_bar(PyObject *self, PyObject *args); static PyMethodDef FooMethods[] = {

我希望在一个包中收集多个Python模块,这样它们就不会从Python包和模块的全局集合中保留太多的名称。但是我对用C编写的模块有问题

下面是一个非常简单的示例,直接来自官方Python文档。您可以在页面底部的以下位置找到它:

我的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;
}
#包括
静态PyObject*
foo_bar(PyObject*self,PyObject*args);
静态PyMethodDef FooMethods[]={
{
“酒吧”,
富吧,
梅瑟·瓦拉格斯,
""
},
{NULL,NULL,0,NULL}
};
静态PyObject*
foo_bar(PyObject*self,PyObject*args)
{
返回Py_BuildValue(“s”、“foobar”);
}
PyMODINIT_FUNC
initfoo(无效)
{
(void)Py_InitModule(“foo”,foo方法);
}
int
main(int argc,char*argv[])
{
//将argv[0]传递给Python解释器
Py_SetProgramName(argv[0]);
//初始化Python解释器。必需。
Py_初始化();
//添加一个静态模块
initfoo();
返回0;
}
它的构建和安装都很好,但我无法导入foopkg.foo!如果我把它改名为“foo”,它就工作得很好


有没有办法让“foopkg.foo”工作起来?例如,将C代码中的“foo”从Py_InitModule()更改为“foopgg.foo”没有任何帮助。

文件夹中必须有一个
\uuu init\uuuu.Py
文件,否则Python将无法识别为包

setup.py
所在的位置创建一个
foopkg
文件夹,并在那里放置一个空文件
\uuuu init\uuuuuuuuuuuuuuupy
,并在
setup.py
中添加一行
packages

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'])],
      )
,而您可以使用,这是
distutils
的增强替代,因此您不需要在
设置()中传递
参数。例如:

从设置工具导入设置,扩展
安装程序(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

,这就成功了!谢谢:)尽管我仍然认为Python文档中应该提到:/
python -c "from foopkg import foo"