2011-02-02 5 views
5

Lo so, lo so, è sporco e tutto. Voglio sapere se è possibile dirottare il modulo __init__ di un modulo Python per sostituirlo con il tuo.Come eseguire il patch delle scimmie __init__ in Python?

Lo sto chiedendo perché ho bisogno di impedire a una lib di django di avviare parte del suo processo di init che lo fa andare in crash con la nostra configurazione.

E sì, è meglio riparare la lib di django e inviare una patch. Sì, sono in contatto con l'autore al riguardo. Ma per ora, ho bisogno di una soluzione rapida.

+4

Che ne dici di modificare "__init __. Py" a proprio piacimento? È tutto solo testo –

risposta

0

È possibile modificare il file __init__.py. Non c'è niente che ti ferma e se lo fai bene non accadrà nulla di brutto.

+0

stavo per commentare che dovrebbe essere una risposta. +1 –

+0

In caso di dubbio, sbloccalo! – jathanism

+0

Vorrei solo eseguire il backup di quello esistente e modificarlo. – XORcist

4

Un modo per dirottare la procedura di importazione consiste nel simulare l'importazione prima che avvenga, in un altro modulo che viene importato prima di quello che si desidera convertire in patch. Inserisci quello che vuoi in sys.modules con il nome del modulo come chiave, e quando arriverà il momento di importare il modulo originale, Python troverà una voce in sys.modules e lo userà. Questo potrebbe non funzionare se l'importazione viene eseguita in qualche modo magico.

D'altra parte, è sempre possibile copiare il progetto originale e adattarlo a proprio piacimento.

+0

+1 ma non ci sono riuscita. Non riesco a vedere come sostituirlo correttamente. Se imposto la voce nel modulo dict, non posso importare i sottomoduli ohter perché la mia versione non si trova nella stessa directory. –

+0

Giusto, ho pensato che potresti avere problemi con l'importazione di sottomoduli. In si potrebbe provare a importare manualmente quei sottomoduli, ma non sono sicuro del modo migliore per farlo. Un'ultima cosa che si può provare è la patch-patch temporanea delle funzioni esterne/globali/ecc. che il modulo in questione utilizza. Dopotutto, se il modulo sta facendo qualcosa che coinvolge effetti collaterali, probabilmente sta chiamando alcune funzioni esterne o modificando le globali. Effettua le patch subito prima dell'importazione e ripristina le patch delle scimmie subito dopo, e dovresti essere OK. –