He estado experimentando con la incrustación de diferentes lenguajes de scripting en una aplicación C++, actualmente estoy probando Stackless Python 3.1. He intentado varios tutoriales y ejemplos, los pocos que puedo encontrar, para intentar ejecutar un script simple desde una aplicación.¿Por qué la Python/C API falla en PyRun_SimpleFile?
Py_Initialize();
FILE* PythonScriptFile = fopen("Python Scripts/Test.py", "r");
if(PythonScriptFile)
{
PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py");
fclose(PythonScriptFile);
}
Py_Finalize();
Por alguna extraña razón, la ejecución de este pedazo de código resultados en una violación de acceso en:
PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py");
He buscado en línea para otros con un problema similar y ha encontrado un único. Su única solución era una solución que sólo parece posible en una versión anterior de Python: Creación de un objeto de archivo y devolver el pitón FILE*
de ese objeto fichero de Python en PyRun_SimpleFile
. Tales llamadas a funciones no están disponibles sin embargo, la API de Python 3.1 crea objetos de archivo de un descriptor de archivo y devuelve los descriptores de archivo, pero la función PyRun_SimpleFile
todavía requiere un FILE*
.
Estoy en una pérdida en cuanto a cómo ejecutar las secuencias de comandos de archivo, sin llegar a cargar el archivo en la memoria manualmente y funcionando como una cadena gigante, ciertamente no es una solución práctica.
Lo que da? ¿Cómo puedo lograr esta tarea si la API tiene un error interno?
Actualización: He logrado construir Stackless Python 3.1 desde la fuente y, sin embargo, el bloqueo permanece completamente sin cambios, a pesar de utilizar la misma biblioteca de tiempo de ejecución de C. Tanto mi proyecto como la fuente de Stackless Python 3.1 están construidos con el compilador C++ de Visual Studio 2010 y el tiempo de ejecución de C. Ya no tengo idea de qué podría resolver este problema, salvo la modificación de Python para usar un nombre de archivo y no un ARCHIVO *. Otra terrible solución.
Sí, yo no construí la librería Stackless Python 3.1. Había leído que el problema podría ser el uso de ARCHIVOS * de diferentes tiempos de ejecución, por lo que la solución fue permitir que la biblioteca de Python creara el ARCHIVO * y lo devolviera para usarlo como argumento para la función. Entonces, ¿no tengo otra opción que adquirir la fuente y construir Stackless Python 3.1 yo mismo? –
Si puedes construir tu código C, entonces no deberías tener ninguna dificultad con el código Stackless. –