2008-09-29 13 views
16

एक मॉड्यूल नाम के साथ एक स्ट्रिंग को देखते हुए, कैसे आप मॉड्यूल में सब कुछ आयात कर सकता हूँ के रूप में यदि आप का आह्वान किया था:कोई पाइथन के __import__ फ़ंक्शन के साथ "मॉड्यूल से आयात * के बराबर" कैसे करता है?

from module import * 

यानी दिया स्ट्रिंग एस = "मॉड्यूल", कैसे एक निम्नलिखित के बराबर मिलता है:

__import__(S, fromlist="*") 

यह अपेक्षा के अनुसार प्रदर्शन नहीं करता है (क्योंकि यह कुछ भी आयात नहीं करता है)।

उत्तर

30

कृपया पुनर्विचार करें। import * से भी बदतर एक चीज जादूimport * है।

यदि आप वास्तव में चाहते हैं के लिए:

m = __import__ (S) 
try: 
    attrlist = m.__all__ 
except AttributeError: 
    attrlist = dir (m) 
for attr in attrlist: 
    globals()[attr] = getattr (m, attr) 
+0

शायद बेहतर: मीटर में .__ all__ attr के लिए? –

+0

@ सेर्गेई: इस बात की कोई गारंटी नहीं है कि मॉड्यूल __all__ –

+1

@ जॉन मिलिकिन को परिभाषित करेगा: लेकिन यदि कोई मॉड्यूल __all__ को परिभाषित करता है तो आपको इसे देखना चाहिए –

0

मूल समस्या यह है कि मैं कुछ Django विकासशील रहा हूँ, लेकिन (सहयोगियों के साथ) एक से अधिक मेजबान, विभिन्न सेटिंग्स के साथ सभी पर है। मैं परियोजना/settings.py फ़ाइल में इस तरह कुछ करने के लिए उम्मीद कर रहा था:

from platform import node 

settings_files = { 'BMH.lan': 'settings_bmh.py", ... } 

__import__(settings_files[ node() ]) 

यह एक सरल उपाय है (इस प्रकार सुरुचिपूर्ण) लग रहा था, लेकिन मैं इस बात से सहमत हैं कि यह करने के लिए एक गंध है और सादगी बाहर चला जाता है लूप जब आपको तर्क मिलता है कि जॉन मिलिकिन ने क्या पोस्ट किया है (धन्यवाद)। यहां अनिवार्य रूप से समाधान है जिसके साथ मैं गया:

from platform import node 

from settings_global import * 

n = node() 

if n == 'BMH.lan': 
    from settings_bmh import * 
# add your own, here... 
else: 
    raise Exception("No host settings for '%s'. See settings.py." % node()) 

जो हमारे उद्देश्यों के लिए ठीक काम करता है।

-2

मैं इसे तो मैं http://www.djangosnippets.org/snippets/600/

try: 
    import socket 
    hostname = socket.gethostname().replace('.','_') 
    exec "from host_settings.%s import *" % hostname 
except ImportError, e: 
    raise e 
+3

मैं देख सकता हूं कि यह कोड कहां से आ रहा है, लेकिन निष्पादन के लिए कॉल मेरी पीठ के नीचे shivers भेजता है। मुझे वास्तव में पता नहीं है कि यह इस मामले में एक बड़ा सौदा है, लेकिन मैंने इस तरह की चीजों के बारे में अपने प्रवृत्तियों पर भरोसा करना सीखा है। –

+0

यह समारोह के अंदर अवैध है, और वास्तव में भयानक लग रहा है। –

1

से एक सरल लेकिन बदसूरत रास्ता ले लिया ऐसा लगता है कि आप भी मॉड्यूल के शब्दकोशों पर dict.update() उपयोग कर सकते हैं में क्या करना एक अच्छा तरीका नहीं मिला अपने मामले:

config = [__import__(name) for name in names_list] 

options = {} 
for conf in config: 
    options.update(conf.__dict__) 

अद्यतन: मुझे लगता है कि इसके बारे में एक छोटे से "कार्यात्मक" संस्करण है:

options = reduce(dict.update, map(__import__, names_list)) 
+0

क्या इल्या का जवाब अमान्य है, या इसे क्यों कम किया गया है? – akaihola

5

Django के लिए स्थानीय सेटिंग्स फ़ाइलों के गतिशील नामकरण के लिए मेरा समाधान यहां है। आयातित फ़ाइल से '__' युक्त विशेषताओं को शामिल करने के लिए चेक के नीचे दिए गए अतिरिक्त नोट पर ध्यान दें। स्थानीय सेटिंग्स फ़ाइल के मॉड्यूल नाम के साथ __name__ ग्लोबल को अधिलेखित किया जा रहा था, जिसके कारण setup_environ() का उपयोग किया गया था, जिसका प्रबंधन manage.py में किया गया था।

try: 
    import socket 
    HOSTNAME = socket.gethostname().replace('.','_') 
    # See http://docs.python.org/library/functions.html#__import__ 
    m = __import__(name="settings_%s" % HOSTNAME, globals=globals(), locals=locals(), fromlist="*") 
    try: 
     attrlist = m.__all__ 
    except AttributeError: 
     attrlist = dir(m)   
    for attr in [a for a in attrlist if '__' not in a]: 
     globals()[attr] = getattr(m, attr) 

except ImportError, e: 
    sys.stderr.write('Unable to read settings_%s.py\n' % HOSTNAME) 
    sys.exit(1) 
संबंधित मुद्दे