Sto tentando di impostare alcuni import hooks tramite sys.meta_path
, con un approccio simile a this SO question. Per questo, ho bisogno di definire due funzioni find_module
e load_module
come spiegato nel link sopra. Qui è la mia funzione load_module
,Ganci di importazione per PyQt4.QtCore
import imp
def load_module(name, path):
fp, pathname, description = imp.find_module(name, path)
try:
module = imp.load_module(name, fp, pathname, description)
finally:
if fp:
fp.close()
return module
che funziona bene per la maggior parte dei moduli, ma non riesce per PyQt4.QtCore
quando si usa Python 2.7:
name = "QtCore"
path = ['/usr/lib64/python2.7/site-packages/PyQt4']
mod = load_module(name, path)
che restituisce,
Traceback (most recent call last):
File "test.py", line 19, in <module>
mod = load_module(name, path)
File "test.py", line 13, in load_module
module = imp.load_module(name, fp, pathname, description)
SystemError: dynamic module not initialized properly
Le stesse opere di codice bene con Python 3.4 (anche se imp
sta diventando deprecato e idealmente dovrebbe essere usato importlib
).
Suppongo che questo abbia qualcosa a che fare con l'inizializzazione del modulo dinamico SIP. C'è qualcos'altro che dovrei provare con Python 2.7?
Nota: questo vale sia per PyQt4
sia per PyQt5
.
Modifica: questo potrebbe essere correlato a this question come del resto,
cd /usr/lib64/python2.7/site-packages/PyQt4
python2 -c 'import QtCore'
fallisce con lo stesso errore. Ancora non sono sicuro di quello che sarebbe un modo intorno ad esso ...
Edit2: in seguito alla richiesta @Nikita s' per un caso ad esempio uso concreto, quello che sto cercando di fare è di reindirizzare l'importazione , quindi quando uno fa import A
, quello che succede è import B
. Si potrebbe davvero pensare che per questo sarebbe sufficiente eseguire la ridenominazione del modulo in find_spec/find_module
e quindi utilizzare il valore predefinito load_module
. Tuttavia, non è chiaro dove trovare un'implementazione di default in load_module
in Python 2. L'implementazione più vicina che ho trovato di qualcosa di simile è future.standard_library.RenameImport
. Non sembra che ci sia un backport dell'implementazione completa di importlib
da Python 3 a 2.
Un esempio di lavoro minimo per i ganci di importazione che riproduce questo problema è disponibile in questo gist.
Se può essere utile, per dare un po 'di contesto generale per quello che sto cercando di fare, vedere il pacchetto [SiQt] (https://github.com/rth/SiQt), e questo problema è discusso in [questo problema github] (https://github.com/rth/SiQt/issues/4). – rth
davvero non capisco il tuo problema, ma cosa c'è di sbagliato con '__import __ ('PyQt4.QtCore')'. porta alla ricorsione infinita? – danidee
@danidee Non c'è niente di sbagliato in '__import __ ('A')', ma è equivalente all'utilizzo di 'import A'. Quello che voglio è cambiare cosa succede quando lo fai, e in particolare esegui "import B", quando tu "importi A". Questo può essere fatto con ganci di importazione in 'sys.meta_path', ma richiedono funzioni di livello inferiore come' imp.load_module'. – rth