Warum stürzt die Python / C-API bei PyRun_SimpleFile ab?

Ich habe mit dem Einbetten verschiedener Skriptsprachen in eine C ++ - Anwendung experimentiert und versuche derzeit, Stackless Python 3.1 zu verwenden. Ich habe verschiedene Tutorials und Beispiele ausprobiert, von denen ich nur wenige finden kann, um ein einfaches Skript aus einer Anwendung heraus auszuführen.

Py_Initialize();

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

Py_Finalize();

Aus irgendeinem Grund führt die Ausführung dieses Codes zu einer Zugriffsverletzung unter:

    PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py");

Ich habe online nach anderen mit einem ähnlichen Problem gesucht und nur eines gefunden. Ihre einzige Lösung war eine Problemumgehung, die nur in einer älteren Version von Python möglich erscheint: Erstellen eines Python-Dateiobjekts und Zurückgeben desFILE* von diesem Python-Datei-Objekt inPyRun_SimpleFile. Solche Funktionsaufrufe sind jedoch nicht verfügbar. Die Python 3.1-API erstellt Dateiobjekte aus einem Dateideskriptor und gibt Dateideskriptoren zurück, aber dasPyRun_SimpleFile Funktion benötigt noch einFILE*.

Ich weiß nicht, wie ich Skripte aus einer Datei ausführen soll, ohne die gesamte Datei manuell in den Speicher zu laden und als riesige Zeichenfolge auszuführen, was sicherlich keine praktische Lösung ist.

Was gibt? Wie kann ich diese Aufgabe ausführen, wenn die API einen internen Fehler aufweist?

Update: Ich habe es geschafft, Stackless Python 3.1 aus dem Quellcode zu erstellen, und dennoch bleibt der Absturz trotz Verwendung derselben C-Laufzeitbibliothek völlig unverändert. Sowohl mein Projekt als auch der Stackless Python 3.1-Quellcode werden mit dem C ++ - Compiler und der C-Laufzeit von Visual Studio 2010 erstellt. Ich habe keine Ahnung mehr, was dieses Problem lösen könnte, abgesehen davon, dass Python so geändert wurde, dass ein Dateiname und keine DATEI * verwendet wird. Ein weiterer schrecklicher Workaround.

Antworten auf die Frage(14)

Ihre Antwort auf die Frage