2017-02-17 9 views
9

मैं how to check if a python module has been imported पढ़ रहा था और निर्देश स्पष्ट दिखते हैं, sys.modules में मॉड्यूल की जांच करें। यह काम करता है जैसा कि मैंने पायथन 2 में अपेक्षित था, लेकिन पायथन 3 (3.5 और 3.6 परीक्षण) के साथ नहीं। उदाहरण के लिए:पाइथन 3 में 'sys.modules' में मॉड्यूल क्यों आयात नहीं किए गए हैं?

अजगर 3,6

>>> import sys 
>>> 'itertools' in sys.modules 
True 

अजगर 2,7

>>> import sys 
>>> 'itertools' in sys.modules 
False 

मैं ध्यान दें कि, itertools अजगर 3 sys.modules dict (<module 'itertools' (built-in)>) में एक 'में निर्मित' के रूप में वर्णन किया गया है, और नहीं पाइथन 2 में शायद यही कारण है कि यह आयात होने से पहले sys.modules में है, लेकिन यह not listed as a built-in है। वैसे भी, itertools के बाद से अभी भी पायथन 3 में आयात करने की आवश्यकता है, मैं एक स्पष्टीकरण के लिए आभारी हूं।

+4

यदि आपके द्वारा पहले से आयात किए गए किसी भी मॉड्यूल * को स्वयं के मॉड्यूल आयात करने की आवश्यकता है, तो उन मॉड्यूल लोड के रूप में दिखाए जाएंगे। शायद पाइथन 3 में एक निर्भरता पेश की गई थी जो पायथन 2 में मौजूद नहीं थी। पीएस यहां तक ​​कि यदि कोई मॉड्यूल लोड हो गया है, तो आपको इसे मौजूदा दायरे में उपलब्ध कराने के लिए इसे 'आयात' करने की आवश्यकता है। –

+1

मुझे लगता है कि आपने स्वयं से सवाल का जवाब दिया है: यदि 'itertools' एक बिल्टिन बन गया है, तो इसे दुभाषिया के स्टार्टअप पर ही लोड किया जाएगा। – ForceBru

+0

सवाल यह है कि क्यों 'itertools' को आयात करने की आवश्यकता है या यह वहां क्यों है और दस्तावेज़ों में सूचीबद्ध नहीं है? –

उत्तर

7

वे आयात किए गए हैं, बस आपके द्वारा नहीं। सटीक रूप से दुभाषिया स्टार्टअप के कौन से हिस्सों ने मॉड्यूल को लोड किया है, यह महत्वपूर्ण कार्यान्वयन विवरण हैं, लेकिन यदि आप चाहें तो संभावित पथ का पता लगा सकते हैं। उदाहरण के लिए, itertoolsreprlib

from itertools import islice 

जो functools से आयात किया जाता है से आयात किया जाता है:

from reprlib import recursive_repr 

जो types से आयात किया जाता है:

import functools as _functools 

जो importlib से आयात किया जाता है:

import types 

जो दुभाषिया स्टार्टअप पर बूटस्ट्रैप किया गया है क्योंकि यह वह जगह है जहां आयात का अधिकांश कार्यान्वयन है।

+0

ग्रेट, आधिकारिक उत्तर के लिए धन्यवाद। तो दुभाषिया 'itertools' आयात करता है (और अन्य मॉड्यूल जैसे' ओएस') लेकिन उन्हें 'ग्लोबल्स()' में नहीं जोड़ता है, इसलिए वे पहुंच योग्य नहीं हैं? –

+0

@Chris_Rands: यह आयात के लिए सामान्य नियमों का पालन करता है। यदि मॉड्यूल 'foo'' आयात बार 'करता है, तो वह आयात केवल' बार 'मॉड्यूल को' foo' मॉड्यूल के लिए उपलब्ध कराता है। प्रत्येक व्यक्ति जो मॉड्यूल का उपयोग करना चाहता है उसे स्वयं आयात करने की आवश्यकता है। – user2357112

+1

और यही कारण है कि आप इसे 'पी 2' में नहीं ढूंढ सकते हैं, जब मैं अनुमान लगा रहा हूं कि आयात तंत्र अभी भी 'सी' में लागू किया गया था और (स्पष्ट रूप से) अप्रत्यक्ष रूप से 'itertools' आयात नहीं किया था। –

-1

ऐसा लगता है कि अजगर 3 में, itertools विस्तार वास्तव में मुख्य अजगर बाइनरी में अजगर 2. विपरीत संकलित किया गया है आप एक

import sys 

और फिर करते हैं एक

'itertools' in sys.builtin_module_names 
>> True 

यह स्पष्ट है । एक पायथन 2.x कंसोल परिणामों में एक ही चरण को False में करना।

As per the docs, की builtin_module_names शामिल 'मॉड्यूल है कि इस अजगर दुभाषिया में संकलित कर रहे हैं'।

+0

में सवाल नहीं है * क्यों * यह है, नहीं यह बस है। –

+0

@ जिमफसारकिस-हिलियार्ड "पाइथन 3 में आयात किए जाने से पहले sys.modules में itwtotos है, और Python 2_ में नहीं" का जवाब है "_because यह एक अंतर्निहित है जो इसकी उपस्थिति में साबित होता है 'buildin_module_names'"। – Anomitra

+2

जबकि मॉड्यूल को पायथन में संकलित किया जाता है, ऐसे मॉड्यूल को अभी भी 'sys.modules' में दिखाई देने से पहले कहीं भी आयात द्वारा लोड और लोड करने की आवश्यकता होती है। – user2357112

संबंधित मुद्दे