Ho sperimentato l'incorporamento di diversi linguaggi di scripting in un'applicazione C++, attualmente sto provando Stackless Python 3.1. Ho provato diversi tutorial ed esempi, i pochi che riesco a trovare, per provare a eseguire un semplice script da un'applicazione.Perché l'API Python/C si blocca su 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();
Per qualche strana ragione, l'esecuzione di questo pezzo di risultati di codice in una violazione di accesso a:
PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py");
Ho cercato on-line per gli altri con un problema simile e hanno trovato solo uno. La loro unica soluzione è stata una soluzione che sembra possibile solo in una versione precedente di Python: creazione di un oggetto file python e restituzione di FILE*
da tale oggetto file python in PyRun_SimpleFile
. Tali chiamate di funzioni non sono tuttavia disponibili, l'API di Python 3.1 crea oggetti file da un descrittore di file e restituisce descrittori di file, ma la funzione PyRun_SimpleFile
richiede ancora un FILE*
.
Sono in perdita su come eseguire qualsiasi script da file, a meno di caricare l'intero file in memoria manualmente e eseguirlo come una stringa gigante, certamente non una soluzione pratica.
Cosa dà? Come posso eseguire questa attività se l'API ha un errore interno?
Aggiornamento: Sono riuscito a creare Stackless Python 3.1 dall'origine e tuttavia l'arresto rimane completamente invariato, nonostante si utilizzi la stessa libreria di runtime C. Sia il mio progetto che l'origine Stackless Python 3.1 sono costruiti con il compilatore C++ di Visual Studio 2010 e il runtime C. Non ho più alcun dubbio su cosa potrebbe risolvere questo problema, a meno di modificare Python per usare un nome di file e non un FILE *. Un'altra soluzione terribile.
Aye, non ho creato la libreria Stackless Python 3.1 autonomamente. Ho letto che il problema potrebbe essere l'uso di FILE * da diversi runtime, quindi perché la soluzione era consentire alla libreria Python di creare il FILE * e restituirlo come argomento per la funzione. Quindi, non ho altra scelta che acquisire il codice sorgente e creare Stackless Python 3.1 da solo? –
Se puoi costruire il tuo codice C, non dovresti avere alcuna difficoltà con il codice Stackless. –