this SO question'a benzer bir yaklaşımla import hooks aracılığıyla sys.meta_path
aracılığıyla kurulum yapmaya çalışıyorum. Bunun için, yukarıdaki bağlantıda açıklandığı gibi iki işlevi find_module
ve load_module
tanımlamalıyım. İşte benim load_module
işlevi, çoğu modülleri için çalışıyor, ancak PyQt4.QtCore
başarısızPyQt4.QtCore için ithalat kancaları
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
olan Python 2.7 kullanırken:
döndürürname = "QtCore"
path = ['/usr/lib64/python2.7/site-packages/PyQt4']
mod = load_module(name, path)
,
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
aynı kod çalışır Python 3.4 ile (imp
kullanımdan kaldırılmış olsa da ve importlib
bunun yerine ideal olarak kullanılmalıdır).
Bunun SIP dinamik modül başlatması ile bir ilgisi olduğunu varsayalım. Python 2.7 ile denemem gereken başka bir şey var mı?
Not: Bu, hem PyQt4
hem de PyQt5
ile geçerlidir.
Düzenleme Bu
cd /usr/lib64/python2.7/site-packages/PyQt4
python2 -c 'import QtCore'
aynı hata başarısız olarak gerçekten
this question ile ilişkili olabilir. Somut bir kullanım durumu, örneğin
@Nikita 'ın talebi üzerine, ne yapmam çalışıyorum ithalat yöneltmek olan: Hala
Edit2 ... Etrafında yol olacağını emin değilim Yani import A
, ne zaman import B
olur. Bunun gerçekten de, bunun için find_spec/find_module
numaralı modülün yeniden isimlendirilmesinin yeterli olacağını ve ardından load_module
numaralı varsayılanı kullanacağını düşünebiliriz. Ancak, Python 2'de bir varsayılan load_module
uygulamasının nerede olduğu belirsizdir. Benzer bir şey bulduğum en yakın uygulama future.standard_library.RenameImport
'dur. importlib
'un Python 3'ten 2'ye tümüyle uygulanmasının bir arka planı gibi görünmüyor.
Bu sorunu yeniden üreten içe aktarma kancaları için en az çalışan bir örnek, bu gist numaralı belgede bulunabilir.
, yapmaya çalıştığım şey, [SiQt] (https://github.com/rth/SiQt) paketini bakınız ilişkin bazı genel bağlam kazandırmak ve bu sorunun etmek [bu github sorunu] 'nda tartışılmıştır (https://github.com/rth/SiQt/issues/4). – rth
Gerçekten sorununuzu anlamıyorum ama '__import __ ('PyQt4.QtCore')' ile ilgili sorun nedir? sonsuz tekrarlamaya yol açıyor mu? – danidee
@danidee __import __ ('A') 'ile yanlış bir şey yok, ama' import A' kullanmanın karşılığıdır. İstediğim şey, bunu yaptığınızda ne olacağını değiştirmek ve özellikle, A'yı içe aktarırken, "İçe aktarma B" yi çalıştırmaktır. Bu sys.meta_path' içinde içe aktarma kancaları ile yapılabilir, ancak bunlar "imp.load_module" gibi daha düşük seviyeli işlevler gerektirir. – rth