Sto lavorando per incorporare Python nella nostra suite di test. Lo scopo è di usare Python per eseguire diversi script di test per raccogliere dati e fare un report di test. Più script di test per un'esecuzione di test possono creare variabili e funzioni globali che possono essere utilizzate nello script successivo.Come reinizializzare un interprete Python integrato?
L'applicazione fornisce anche moduli di estensione importati nell'interprete incorporato e utilizzati per lo scambio di alcuni dati con l'applicazione.
Ma l'utente può anche eseguire più corse di prova. Non voglio condividere questi dati globali, le importazioni e i dati scambiati tra più esecuzioni di test. Devo essere sicuro di riavviare in uno stato originale per controllare l'ambiente di test e ottenere gli stessi risultati.
Come reinizializzare l'interprete?
Ho usato Py_Initialize() e Py_Finalize(), ma ottengo un'eccezione nella seconda esecuzione quando si inizializza una seconda volta i moduli di estensione che fornisco all'interprete. E la documentazione warns against using it more than once.
L'utilizzo di sub-interpreters sembra avere gli stessi avvertimenti con l'inizializzazione dei moduli di estensione.
Ho il sospetto che stia facendo qualcosa di sbagliato con l'inizializzazione dei miei moduli di estensione, ma temo che lo stesso problema si verifichi con i moduli di estensione di terze parti.
Forse è possibile farlo funzionare avviando l'interprete nel proprio processo, in modo da essere sicuri che tutta la memoria sia rilasciata.
A proposito, sto usando boost-python per questo, che avverte anche CONTRO l'uso di Py_Finalize!
Qualche suggerimento?
Grazie
Quindi, in sostanza, dovrei creare un'istanza una volta che il mio interprete Python e utilizzare questo interprete per avviare subinterpretatori, che tutti hanno il loro spazio dei nomi molto personale? Sembra una soluzione valida, se questi subinterpreti non soffrono degli stessi avvertimenti di quelli creati con Py_NewInterpreter. Guarderò in dettaglio in quello e sperimenterò con esso. Grazie! – nab
Hai capito. Instanciating un InteractiveInterpreter ti dà un ambiente fresco ogni volta. Non sono sicuro di quali siano le regole riguardanti ciò che viene ereditato dall'interprete principale, ma dovrebbe essere facile da controllare in entrambi i modi. –
Sembra fare quello che voglio. Si noti che ha la stessa mancanza di inizializzazione dei moduli (vengono inizializzati solo una volta). Ma funziona bene per ripulire lo spazio dei nomi. Grazie! – nab