无法导入用 C 编写的 Python 模块
Unable to import Python module written in C
我一直在努力弄清楚如何从 C 脚本(没有 swig 或除 MinGW 之外的任何其他东西)制作 .pyd
(Python 扩展模块)文件,并已成功将其构建到.pyd
.
然而,当我尝试导入模块时出现问题。
如果我 运行 模块 运行 成功(据我所知),然后出现一个错误说 Python Has Stopped Working
并且它关闭而不执行其余部分程序。
这是我的 C 脚本 (test.c):
#include <python.h>
int main()
{
PyInit_test();
return 0;
}
int PyInit_test()
{
printf("hello world");
}
和Python脚本(file.py):
import test
print('Run From Python Extension')
我用以下代码编译脚本:
gcc -c file.py
gcc -shared -o test.pyd test.c
我在命令提示符下编译时找不到任何错误,我正在使用 python 3.6(运行ning on Windows 10)。
我找不到太多关于这个主题的东西,我宁愿远离 Cython(我已经知道 C)和 Swig。
如果能告诉我哪里出了问题,那就太好了。
创建 Python 扩展与编写常规 C 代码完全不同。您所做的只是创建了一个有效的 C 程序,但这对 Python.
没有意义
你的程序应该是这样的(它只是一个框架,不是正确的工作代码):
#include <Python.h>
#include <stdlib.h>
static PyObject* test(PyObject* self, PyObject* args)
{
printf("hello world");
return NULL;
}
static PyMethodDef test_methods[] = {
{"test", test, METH_VARARGS, "My test method."},
{NULL, NULL, 0, NULL} /* Sentinel */
};
PyMODINIT_FUNC init_test_methods() {
Py_InitModule("test", test_methods);
}
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 */
init_test_methods();
}
我建议您在以下 link 阅读更多相关信息:http://dan.iel.fm/posts/python-c-extensions/ as well as in the official docs。
我一直在努力弄清楚如何从 C 脚本(没有 swig 或除 MinGW 之外的任何其他东西)制作 .pyd
(Python 扩展模块)文件,并已成功将其构建到.pyd
.
然而,当我尝试导入模块时出现问题。
如果我 运行 模块 运行 成功(据我所知),然后出现一个错误说 Python Has Stopped Working
并且它关闭而不执行其余部分程序。
这是我的 C 脚本 (test.c):
#include <python.h>
int main()
{
PyInit_test();
return 0;
}
int PyInit_test()
{
printf("hello world");
}
和Python脚本(file.py):
import test
print('Run From Python Extension')
我用以下代码编译脚本:
gcc -c file.py
gcc -shared -o test.pyd test.c
我在命令提示符下编译时找不到任何错误,我正在使用 python 3.6(运行ning on Windows 10)。
我找不到太多关于这个主题的东西,我宁愿远离 Cython(我已经知道 C)和 Swig。
如果能告诉我哪里出了问题,那就太好了。
创建 Python 扩展与编写常规 C 代码完全不同。您所做的只是创建了一个有效的 C 程序,但这对 Python.
没有意义你的程序应该是这样的(它只是一个框架,不是正确的工作代码):
#include <Python.h>
#include <stdlib.h>
static PyObject* test(PyObject* self, PyObject* args)
{
printf("hello world");
return NULL;
}
static PyMethodDef test_methods[] = {
{"test", test, METH_VARARGS, "My test method."},
{NULL, NULL, 0, NULL} /* Sentinel */
};
PyMODINIT_FUNC init_test_methods() {
Py_InitModule("test", test_methods);
}
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 */
init_test_methods();
}
我建议您在以下 link 阅读更多相关信息:http://dan.iel.fm/posts/python-c-extensions/ as well as in the official docs。