我一直在尝试在 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();
出于某种奇怪的原因,运行这段代码会导致访问冲突:
PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py");
我在网上搜索了其他有类似问题的人,只找到了一个。他们唯一的解决方案是一种只有在旧版本的 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*。另一个可怕的解决方法。