Sto lavorando su pypreprocessor che è un preprocessore che prende le direttive in stile c e sono riuscito a farlo funzionare come un preprocessore tradizionale (è auto-consumante ed esegue il codice postelaborato al volo) eccetto che rompe le importazioni della biblioteca.Come sovrascrivere un'importazione Python?
Il problema è: il preprocessore esegue il file, lo elabora, restituisce un file temporaneo ed exec() il file temporaneo. Le librerie importate devono essere gestite in modo un po 'diverso, perché non vengono eseguite, ma vengono caricate e rese accessibili al modulo chiamante.
Quello che devo essere in grado di fare è: Interrompere l'importazione (dal momento che il preprocessore viene eseguito nel mezzo dell'importazione), caricare il codice postelaborato come tempModule e sostituire l'importazione originale con tempModule per ingannare lo script chiamante con l'importazione a credere che tempModule sia il modulo originale.
Ho cercato dappertutto e finora e non ho soluzione.
Questo Stack Overflow domanda è la più vicina che ho visto finora a fornire una risposta: Override namespace in Python
Ecco quello che ho.
# Remove the bytecode file created by the first import
os.remove(moduleName + '.pyc')
# Remove the first import
del sys.modules[moduleName]
# Import the postprocessed module
tmpModule = __import__(tmpModuleName)
# Set first module's reference to point to the preprocessed module
sys.modules[moduleName] = tmpModule
moduleName è il nome del modulo originale e tmpModuleName è il nome del file di codice postelaborato.
La parte strana è che questa soluzione è ancora completamente normale come se il primo modulo fosse stato completato correttamente; a meno che non si rimuova l'ultima riga, si ottiene un errore non trovato nel modulo.
Speriamo che qualcuno su Stack Overflow conosca molto di più sulle importazioni di me, perché questo mi ha bloccato.
Nota: assegnerò solo una soluzione o, se ciò non è possibile in Python; la spiegazione migliore e più dettagliata del perché questo non è impossibile.
Aggiornamento: per chiunque sia interessato, ecco il codice di lavoro.
if imp.lock_held() is True:
del sys.modules[moduleName]
sys.modules[tmpModuleName] = __import__(tmpModuleName)
sys.modules[moduleName] = __import__(tmpModuleName)
La parte 'imp.lock_held' rileva se il modulo viene caricato come libreria. Le seguenti linee fanno il resto.
Si sta scrivendo un pre-processore, è necessario analizzare i file prima di compilarli. Cioè dovresti essere in grado di cambiare il 'modulo di importazione' in' import post_processed_module' prima che il runtime di python carichi il tuo file, analizzando il sorgente, modificandolo e inserendolo in un file. Dopo aver pre-elaborato tutto l'albero dei sorgenti, si può eseguire exec() il file root post-processato. – Iacopo
@lacopo Sfortunatamente, il preprocessore deve essere importato nel file in fase di pre-elaborazione. È una specie di, importare il preprocessore e le direttive del preprocessore funzioneranno in questo file. IE. è auto-consumante. –