为什么Python/C API在PyRun_SimpleFile上崩溃?

Sio*_*vok 13 c++ python scripting cross-language python-stackless

我一直在尝试在C++应用程序中嵌入不同的脚本语言,目前我正在尝试Stackless Python 3.1.我已经尝试了几个教程和示例,我可以找到的很少,尝试从应用程序运行一个简单的脚本.

Py_Initialize();

FILE* PythonScriptFile = fopen("Python Scripts/Test.py", "r");
if(PythonScriptFile)
{
    PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py");
    fclose(PythonScriptFile);
}

Py_Finalize();
Run Code Online (Sandbox Code Playgroud)

出于某些奇怪的原因,运行此代码会导致访问冲突:

    PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py");
Run Code Online (Sandbox Code Playgroud)

我在网上搜索了类似问题的其他人,发现只有一个.他们唯一的解决方案是只在老版本的Python中才有可能的解决方法:创建一个python文件对象并将该python文件对象返回FILE*PyRun_SimpleFile.但是,这样的函数调用不可用,Python 3.1 API从文件描述符创建文件对象并返回文件描述符,但该PyRun_SimpleFile函数仍然需要FILE*.

我不知道如何从文件中运行任何脚本,没有手动将整个文件加载到内存中并将其作为一个巨大的字符串运行,当然不是一个实用的解决方案.

是什么赋予了?如果API有内部错误,我该如何完成此任务?

更新:我已经设法从源代码构建Stackless Python 3.1,尽管使用了相同的C运行时库,但崩溃仍然完全没有变化.我的项目和Stackless Python 3.1源都是使用Visual Studio 2010的C++编译器和C运行时构建的.我不再对可能解决这个问题的问题有所了解,只是修改Python以使用文件名而不是FILE*.另一个可怕的解决方法.

sam*_*bha 12

我遇到了类似的崩溃并做了以下事情:

   PyObject* PyFileObject = PyFile_FromString("test.py", "r");
   PyRun_SimpleFileEx(PyFile_AsFile(PyFileObject), "test.py", 1);
Run Code Online (Sandbox Code Playgroud)

请注意,这是在python 2.7中.我不知道API是否在3.x中发生了变化.


小智 9

这适用于Python 3:

 PyObject *obj = Py_BuildValue("s", "test.py");
 FILE *file = _Py_fopen_obj(obj, "r+");
 if(file != NULL) {
     PyRun_SimpleFile(file, "test.py");
 }
Run Code Online (Sandbox Code Playgroud)

我希望它会有用.

  • 适用于我,但修改很少:FILE*file = _Py_fopen("test.py","r +"); PyRun_SimpleFile(文件,"test.py"); 这应该标记为答案. (2认同)

Jac*_*lly 5

您的代码在我安装的Python 2.6版本上正常运行.我还从源代码构建了无堆栈3.1.2,它工作正常.这是在Ubuntu 10.04上的g ++ 4.4.3.如果您使用的是Windows,则可能需要检查无堆栈和代码是否针对相同的C运行时构建.


Ned*_*der 3

这听起来像是 API 不匹配的问题。如果您的代码和 Python 运行时是使用不同的编译器甚至不同的编译器选项进行编译的,则访问 FILE* 可能会导致访问冲突。您能否仔细检查一下您是否已正确构建 C 代码?

您提到您正在将 Python 嵌入到您的 C++ 应用程序中。请记住,Python 是 C 代码,编译为 C 代码。也许这就是问题的根源?