के लिए आयात हुक I के कुछ समान दृष्टिकोण में sys.meta_path
के माध्यम से कुछ import hooks सेट करने का प्रयास कर रहा हूं। इसके लिए, मुझे उपरोक्त लिंक में बताए गए अनुसार दो कार्यों को find_module
और load_module
परिभाषित करने की आवश्यकता है। यहाँ मेरी load_module
समारोह,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
जो सबसे मॉड्यूल के लिए ठीक काम करता है, लेकिन PyQt4.QtCore
के लिए विफल रहता है जब अजगर 2.7 का उपयोग कर:
name = "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
एक ही कोड काम करता है पायथन 3.4 के साथ ठीक है (हालांकि imp
बहिष्कृत हो रहा है और importlib
आदर्श रूप से इसके बजाय उपयोग किया जाना चाहिए)।
मुझे लगता है कि एसआईपी गतिशील मॉड्यूल प्रारंभिकरण के साथ इसका कुछ संबंध है। क्या कुछ और है जो मुझे पायथन 2.7 के साथ आज़माएं?
नोट: यह PyQt4
और PyQt5
दोनों के साथ लागू होता है।
संपादित: इस this question के रूप में वास्तव में से संबंधित हो सकता,
cd /usr/lib64/python2.7/site-packages/PyQt4
python2 -c 'import QtCore'
एक ही त्रुटि के साथ विफल। फिर भी मुझे यकीन है कि क्या इसके चारों ओर एक तरीका होगा नहीं कर रहा हूँ ...
EDIT2: एक ठोस उपयोग के मामले उदाहरण के लिए @Nikita के अनुरोध के बाद, मुझे क्या करना कोशिश कर रहा हूँ आयात पुनर्निर्देशित करना होता है , इसलिए जब कोई import A
करता है, तो import B
क्या होता है। कोई वास्तव में सोच सकता है कि इसके लिए find_spec/find_module
में मॉड्यूल नामकरण करने के लिए पर्याप्त होगा और फिर डिफ़ॉल्ट load_module
का उपयोग करें। हालांकि, यह स्पष्ट नहीं है कि पाइथन 2 में एक डिफ़ॉल्ट load_module
कार्यान्वयन कहाँ प्राप्त करें। निकटतम कार्यान्वयन मैंने कुछ ऐसा पाया है जो future.standard_library.RenameImport
है। ऐसा लगता है कि पाइथन 3 से 2. के पूर्ण कार्यान्वयन का बैकपोर्ट नहीं है।
इस समस्या को पुन: उत्पन्न करने वाले आयात हुक के लिए एक न्यूनतम कार्य उदाहरण इस gist में पाया जा सकता है।
यह उपयोगी हो सकता है, तो मुझे क्या करना है कोशिश कर रहा हूँ, [SiQt] (https://github.com/rth/SiQt) पैकेज को देखने के लिए कुछ सामान्य संदर्भ देने के लिए, और इस समस्या है [इस जिथब मुद्दे] में चर्चा की गई (https://github.com/rth/SiQt/issues/4)। – rth
मैं वास्तव में आपकी समस्या को समझ नहीं पा रहा हूं लेकिन '__import __ ('PyQt4.QtCore') के साथ क्या गलत है। क्या यह अनंत रिकर्सन का कारण बनता है? – danidee
@danidee '__import __ ('ए') 'के साथ कुछ भी गलत नहीं है, लेकिन यह' आयात ए 'का उपयोग करने के बराबर है। मैं जो चाहता हूं उसे बदलना है, जब आप ऐसा करते हैं, और विशेष रूप से 'आयात बी' चलाते हैं, जब आप 'ए आयात करते हैं'। यह 'sys.meta_path' में आयात हुक के साथ किया जा सकता है, लेकिन उन्हें 'imp.load_module' जैसे निम्न स्तर के कार्यों की आवश्यकता होती है। – rth