Ich habe mit der Einbettung verschiedener Skriptsprachen in eine C++ - Anwendung experimentiert, derzeit versuche ich Stackless Python 3.1. Ich habe mehrere Tutorials und Beispiele ausprobiert, die ich nur finden kann, um ein einfaches Skript aus einer Anwendung zu starten.Warum stürzt die Python/C-API bei PyRun_SimpleFile ab?
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, dieses Stück Code führt zu einer Zugriffsverletzung am Laufen:
PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py");
Ich habe für andere mit einem ähnlichen Problem gesucht online und fand nur eine. Ihre einzige Lösung war eine Problemumgehung, die nur in einer älteren Version von Python möglich scheint: Erstellen eines Python-Dateiobjekts und Zurückgeben des FILE*
von diesem Python-Dateiobjekt an PyRun_SimpleFile
. Solche Funktionsaufrufe sind jedoch nicht verfügbar, die Python 3.1-API erstellt Dateiobjekte aus einem Dateideskriptor und gibt Dateideskriptoren zurück, aber die PyRun_SimpleFile
-Funktion benötigt weiterhin eine FILE*
.
Ich bin ratlos, wie man irgendwelche Scripts von der Akte laufen lässt, kurz, die gesamte Akte in den Speicher manuell zu laden und es als eine riesige Schnur laufen zu lassen, sicher nicht eine praktische Lösung.
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 von der Quelle zu erstellen, und dennoch bleibt der Absturz trotz der Verwendung der gleichen C-Laufzeitbibliothek vollständig unverändert. Sowohl mein Projekt als auch die Stackless Python 3.1-Quelle 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, außer Python zu modifizieren, um einen Dateinamen und nicht eine Datei * zu verwenden. Ein weiterer schrecklicher Workaround.
Aye, ich habe die Stackless Python 3.1-Bibliothek nicht selbst erstellt. Ich würde lesen, dass das Problem sehr wohl die Verwendung von FILE * s aus verschiedenen Laufzeiten sein könnte, weshalb die Problemumgehung darin bestand, der Python-Bibliothek zu ermöglichen, die FILE * zu erstellen und sie als Argument für die Funktion zurückzugeben. Also, habe ich keine andere Wahl als die Quelle zu erwerben und Stackless Python 3.1 selbst zu bauen? –
Wenn Sie Ihren C-Code erstellen können, sollten Sie keine Schwierigkeiten mit dem Stackless-Code haben. –