Mi piacerebbe creare un'applicazione con interprete python incorporato e funzionalità di debug di base. Ora sto cercando l'API per le funzioni che potrei usare per eseguire il codice di esecuzione e ottenere il numero della riga corrente del codice che è in corso (o sta per essere) eseguita.Esecuzione del codice di traccia nell'interprete Python incorporato
I documenti Python ufficiali sembrano essere un po 'sottotono per me quando arriva a tracing and profiling. Non esiste, ad esempio, alcuna informazione sul significato del valore di ritorno di Py_tracefunc
.
Finora ho montato il seguente:
#include <Python.h>
static int lineCounter = 0;
int trace(PyObject *obj, PyFrameObject *frame, int what, PyObject *arg)
{
if(what == PyTrace_LINE)
{
lineCounter += 1;
printf("line %d\n", lineCounter);
}
return 0;
}
int main(int argc, char *argv[])
{
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
if (program == NULL) {
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
exit(1);
}
Py_SetProgramName(program); /* optional but recommended */
Py_Initialize();
PyEval_SetTrace(trace, NULL);
char *code = "def adder(a, b):\n"
" return a + b\n"
"x = 3\n"
"y = 4\n"
"print(adder(x, y))\n";
PyRun_SimpleString(code);
Py_Finalize();
PyMem_RawFree(program);
return 0;
}
Tuttavia, il compilatore emette il seguente errore:
hello.c:5:26: error: unknown type name ‘PyFrameObject’
int trace(PyObject *obj, PyFrameObject *frame, int what, PyObject *arg)
^
sto operando su ManjaroLinux e utilizzando il seguente per compilare il sopra :
gcc -o hello hello.c -I/usr/include/python3.5m -Wno-unused-result -Wsign-compare -Wunreachable-code -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -L/usr/lib -lpython3.5m -lpthread -ldl -lutil -lm -Xlinker -export-dynamic
ho trovato che posso sostituire PyFrameObject
con struct _frame
e poi programma la compilazione ma tutti sanno che si tratta di un trucco sporco, non di una soluzione.
Le uscite eseguibile seguenti:
line 1
line 2
line 3
line 4
line 5
7
Ma vuoi le tracce di seguire il flusso di esecuzione dello script (cioè: Iniziamo dalla linea 3, poi 4, 5 e poi, a causa alla chiamata di funzione, 2).
Non sono riuscito a trovare nulla sull'esecuzione passo-passo.
Potresti raccomandare altre fonti sull'API Python C con maggiori informazioni e qualche introduzione all'argomento?
Ho assegnato la risposta con taglia poiché sarebbe scaduta lo stesso. Tuttavia, sto ancora cercando e sarei grato per le risposte ad altre domande dall'alto.
Questo potrebbe aiutare per quanto riguarda la funzione di traccia: https://docs.python.org/3/library/sys.html#sys.settrace –
Oltre a ciò, utilizzare la fonte, Luke! –
@SvenMarnach: intendi file di intestazione Python? – Luke