2017-06-12 13 views
8

जैसा कि here पर चर्चा की गई है, हम स्ट्रिंग चर का उपयोग करके गतिशील रूप से एक मॉड्यूल आयात कर सकते हैं।पायथन गतिशील आयात - चर से मॉड्यूल नाम से * आयात कैसे करें?

import importlib 
importlib.import_module('os.path') 

मेरा प्रश्न स्ट्रिंग चर से import * कैसे है?

इस तरह कुछ बात अब

importlib.import_module('os.path.*') 
+1

आप ऐसा करने की कोशिश क्यों कर रहे हैं? '*' -इम्पोर्ट्स आम तौर पर फंसे हुए होते हैं, वे नेमस्पेस को अव्यवस्थित करते हैं और आप उन चीजों को आयात कर सकते हैं जिन्हें आप इरादा नहीं करते थे (उदाहरण के लिए एक मॉड्यूल अपडेट किया गया है, एक नया फ़ंक्शन प्राप्त करता है जो पहले के आयात को ओवरराइड करता है)। क्या आपके पास गतिशील रूप से ऐसा करने के लिए ठोस उपयोग है? – mata

+0

मुझे पता है कि 'आयात *' ध्वनि खतरनाक है; हालांकि यह सरल उपयोग के मामले के लिए काम करता है। मेरा कंक्रीट यूजकेस यह है कि मैं 'पायथन परीक्षण' चलाने के लिए 'प्रोबोस्किस' का उपयोग करने की कोशिश कर रहा हूं जो मुझे परीक्षण परीक्षा को चलाने के लिए अनुमति देता है - चयनित परीक्षण सूट परीक्षण फ़ाइल नामों की एक सरणी द्वारा परिभाषित किया जाता है। –

उत्तर

14

आप निम्नलिखित चाल कर सकते हैं के लिए काम नहीं कर रहा:

>>> import importlib 
>>> globals().update(importlib.import_module('math').__dict__) 
>>> sin 
<built-in function sin> 

चेतावनी दी हो मॉड्यूल उपलब्ध में सभी के नाम करता है कि स्थानीय स्तर पर है, इसलिए यह थोड़ा अलग है * से अधिक क्योंकि यह __all__ से शुरू नहीं होता है, उदाहरण के लिए यह __name__, __package__, __loader__, __doc__ ओवरराइड भी करेगा।

अद्यतन: जवाब और अधिक संपूर्ण बनाने के लिए मदद करने के लिए वियतनाम जी वीयू के

module = importlib.import_module('math') 

globals().update(
    {n: getattr(module, n) for n in module.__all__} if hasattr(module, '__all__') 
    else 
    {k: v for (k, v) in module.__dict__.items() if not k.startswith('_') 
}) 

विशेष धन्यवाद:

यहाँ एक अधिक सटीक और सुरक्षित संस्करण के रूप में @mata comments में बताया है।

+0

मुझे यह नहीं मिलता कि आपका मतलब क्या है 'यह थोड़ा अलग है * क्योंकि यह __all__' से शुरू नहीं होता है - यह ** ** ** क्या है? –

+2

यह '__name__',' __package__', '__loader__',' __doc__' जैसी चीजें भी आयात करेगा, जिन्हें आप निश्चित रूप से आयात नहीं करना चाहते हैं। – mata

+5

एक पाप से अधिक – hurturk

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