我想在一个程序包下收集多个Python模块,因此它们不会在python程序包和模块的全局集合中保留太多名称。但是我用C编写的模块有问题。
这是一个非常简单的示例,直接来自官方Python文档。
-------欢迎加入python学习交流扣扣裙851211580-------
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”工作吗?例如,将“ foo”从C代码中的Py_InitModule()更改为“ foopkg.foo”无济于事。
解决方案
__ init__.py文件foopkg夹中必须有一个文件,否则Python无法识别为软件包。
foopkg在其中创建一个文件夹setup.py,然后在其中放置一个空文件__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开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。