Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法导入用C编写的Python模块_Python_C_Python C Api_Pyd - Fatal编程技术网

无法导入用C编写的Python模块

无法导入用C编写的Python模块,python,c,python-c-api,pyd,Python,C,Python C Api,Pyd,我一直在努力研究如何从C脚本(没有swig或除MinGW以外的任何东西)生成.pyd(Python扩展模块)文件,并成功地将其构建到.pyd中 但是,当我尝试导入模块时,问题就出现了 如果我运行它,模块将成功运行(据我所知),然后出现一个错误,说明Python已停止工作,它将关闭,而不执行程序的其余部分 这是我的C脚本(test.C): 我用以下代码编译脚本: gcc -c file.py gcc -shared -o test.pyd test.c 在命令提示符下编译时,我没有发现任何错误,

我一直在努力研究如何从C脚本(没有swig或除MinGW以外的任何东西)生成
.pyd
(Python扩展模块)文件,并成功地将其构建到
.pyd

但是,当我尝试导入模块时,问题就出现了

如果我运行它,模块将成功运行(据我所知),然后出现一个错误,说明
Python已停止工作
,它将关闭,而不执行程序的其余部分

这是我的C脚本(test.C):

我用以下代码编译脚本:

gcc -c file.py
gcc -shared -o test.pyd test.c
在命令提示符下编译时,我没有发现任何错误,我正在使用python 3.6(在Windows 10上运行)

我找不到太多关于这个主题的东西,我宁愿远离Cython(我已经知道C)和Swig


任何能告诉我问题所在的帮助都是非常棒的。

创建Python扩展与编写常规C代码完全不同。您所做的只是创建一个有效的C程序,但这对于Python来说没有意义

这就是程序的外观(它只是一个框架,不是正确的工作代码):

#包括
#包括
静态PyObject*测试(PyObject*self,PyObject*args)
{
printf(“你好世界”);
返回NULL;
}
静态PyMethodDef测试方法[]={
{“test”,test,METH_VARARGS,“我的测试方法。”},
{NULL,NULL,0,NULL}/*哨兵*/
};
PyMODINIT_FUNC init_test_方法(){
Py_初始模块(“测试”,测试方法);
}
int main(int argc,字符**argv)
{
/*将argv[0]传递给Python解释器*/
Py_SetProgramName(argv[0]);
/*初始化Python解释器。必需*/
Py_初始化();
/*添加一个静态模块*/
初始化测试方法();
}

我建议您在以下链接中阅读更多关于这方面的内容:以及。

创建Python扩展与编写常规C代码完全不同。您所做的只是创建一个有效的C程序,但这对于Python来说没有意义

这就是程序的外观(它只是一个框架,不是正确的工作代码):

#包括
#包括
静态PyObject*测试(PyObject*self,PyObject*args)
{
printf(“你好世界”);
返回NULL;
}
静态PyMethodDef测试方法[]={
{“test”,test,METH_VARARGS,“我的测试方法。”},
{NULL,NULL,0,NULL}/*哨兵*/
};
PyMODINIT_FUNC init_test_方法(){
Py_初始模块(“测试”,测试方法);
}
int main(int argc,字符**argv)
{
/*将argv[0]传递给Python解释器*/
Py_SetProgramName(argv[0]);
/*初始化Python解释器。必需*/
Py_初始化();
/*添加一个静态模块*/
初始化测试方法();
}

我建议您在以下链接中阅读更多关于这方面的内容:
.pyd
文件是否与尝试导入它的Python脚本位于同一文件夹中?Python在某些位置以定义的方式搜索模块,可能只是库不在它所看到的任何位置。请参阅文档中的。您的模块初始化函数不会进行任何初始化模块的尝试。它甚至没有正确的返回类型。你读过文档了吗?@martineau我把
.pyd
放在我试图从中导入的python脚本所在的文件夹中。这让我思考,我把它放进了图书馆。从这里,我可以导入它而不出现错误,但是“hello world”没有打印“finished”是不是
.pyd
文件与尝试导入它的Python脚本位于同一文件夹中?Python在某些位置以定义的方式搜索模块,可能只是库不在它所看到的任何位置。请参阅文档中的。您的模块初始化函数不会进行任何初始化模块的尝试。它甚至没有正确的返回类型。你读过文档了吗?@martineau我把
.pyd
放在我试图从中导入的python脚本所在的文件夹中。这让我思考,我把它放进了图书馆。从这里,我可以导入它而不会出现错误,但是“hello world”没有打印“finished”,这很有意义。谢谢你的帮助。正如你所说,它是不同的,那么编译是好的,还是我必须做一些不同的事情来编译它(安装脚本)?编译没有秘密。如果您愿意,请看一下我的这个项目,在这个项目中,我用C实现了Caesar密码,并为其提供了Python扩展:这对编译问题进行了排序,并为我提供了一个非常好的学习示例。至于编译,它是
setup.py build
而不是我之前所说的。再次感谢!最后一点提示:
setup.py build
不断生成一个错误,表示
找不到vcvarsall.bat
我在末尾使用了
-c mingw32
标志。这又出了一个错误,它最终被编译了。太好了,@Simon!因为我通常不在Windows中编程,所以我没有意识到这个问题。很高兴知道你找到了答案,这很有道理。谢谢你的帮助。正如你所说,它是不同的,那么编译是好的,还是我必须做一些不同的事情来编译它(安装脚本)?编译没有秘密。如果您愿意,请看一下我的这个项目,在这个项目中,我用C实现了Caesar密码,并为其提供了Python扩展:这对编译问题进行了排序,并为我提供了一个非常好的学习示例。至于编译,它是
setup.py build
而不是我之前所说的。再次感谢!最后一点提示:
setup.py build
不断生成一个错误,表示
找不到vcvarsall.bat
我在末尾使用了
-c mingw32
标志。这又出了一个错误,它最终被编译了。太好了,@Simon!因为我通常不在Windows中编程,所以我
import test
print('Run From Python Extension')
gcc -c file.py
gcc -shared -o test.pyd test.c
#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();
}