2009-05-26 22 views
12

हालांकि यह पाइथन में एक अन्य मॉड्यूल में "बच्चे" मॉड्यूल आयात करने और इसकी विशेषताओं को सूचीबद्ध करने के लिए काफी छोटा है, लेकिन जब आप सभी बच्चे मॉड्यूल आयात करना चाहते हैं तो यह थोड़ा और मुश्किल हो जाता है।पायथन में सभी बच्चे मॉड्यूल कैसे खोजें?

मैं मौजूदा 3 डी एप्लिकेशन के लिए टूल की लाइब्रेरी बना रहा हूं। प्रत्येक टूल में अपना मेनू आइटम और उप मेन्यू होता है। मैं टूल को अपने मेन्यू बनाने के लिए ज़िम्मेदार होना चाहता हूं क्योंकि उनमें से कई संदर्भ और टेम्पलेट्स के आधार पर बदलते हैं। मैं अपने बेस मॉड्यूल को सभी बाल मॉड्यूल ढूंढने और create_menu() फ़ंक्शन के लिए जांचने में सक्षम होना चाहता हूं और इसे पाता हूं तो इसे कॉल करें।

सभी बाल मॉड्यूल को खोजने का सबसे आसान तरीका क्या है?

+0

क्या यह संबंधित है? [(setuptools पैकेज से 'pkg_resources')] (http://jeetworks.org/node/49) –

+1

[pkgutil.walk_packages] का उपयोग करें (http://docs.python.org/library/pkgutil.html#pkgutil। walk_packages)। – Dag

+1

मॉड्यूल पैकेज नहीं हैं –

उत्तर

0

dir() और imp module

+0

आईपी मुझे आवश्यक सटीक मॉड्यूल की तरह दिखता है! धन्यवाद। – Soviut

+11

यह एक सुंदर जवाब है, मुझे नहीं लगता कि यह क्यों स्वीकार किया गया था। डीआईआर() के लिए प्रलेखन मानता है कि आपके ऑब्जेक्ट में पहले से ही विशेषताएं हैं। क्या आप विस्तारित कर सकते हैं और कह सकते हैं * मॉड्यूल को अभी तक आयात नहीं करने के लिए किसी को डीआईआर() का उपयोग कैसे करना चाहिए? – bignose

+3

नहीं: '$ mkdir foo $ स्पर्श foo/__ init__.py $ स्पर्श foo/bar.py $ अजगर अजगर 2.7.1+ (r271: 86,832, अप्रैल 11, 2011, 18:05:24) [जीसीसी 4.5.2] linux2 पर अधिक जानकारी के लिए "सहायता", "कॉपीराइट", "क्रेडिट" या "लाइसेंस" टाइप करें। >>> आयात foo >>> foo <से मॉड्यूल 'foo' 'foo/__ init __। Py'> >>> dir (foo) [ '__builtins__', '__doc__', '__FILE__', '__name__ ',' __package__ ',' __path__ '] >>> foo आयात बार से >>> बार ' –

1

का उपयोग कर मैं एक तरह की और अजगर में सिर्फ शुरुआत प्रोग्रामिंग मैं अपने मॉड्यूलर आईआरसी बॉट के लिए इस लिखा है था जब:


    # Load plugins 

    _plugins = [] 

    def ifName(name): 
     try: 
      return re.match('([^_.].+)\.[^.]+', a).group(1) 
     except: 
      return None 

    def isValidPlugin(obj): 
     from common.base import PluginBase 
     try: 
      if obj.__base__ == PluginBase: 
       return True 
      else: 
       return False 
     except: 
      return False 

    plugin_names = set(ifilter(lambda a: a!=None, [ifName(a) for a in os.listdir(os.path.join(os.getcwd(), 'plugins'))])) 
    for plugin_name in plugin_names: 
     try: 
      plugin = __import__('plugins.'+plugin_name, fromlist=['plugins']) 
      valid_plugins = filter(lambda a: isValidPlugin(a), [plugin.__getattribute__(a) for a in dir(plugin)]) 
      _plugins.extend(valid_plugins) 
     except Exception, e: 
      logger.exception('Error loading plugin %s', plugin_name) 

    # Run plugins 

    _plugins = [klass() for klass in _plugins] 

यह सुरक्षित नहीं है या "सही" जिस तरह से, लेकिन शायद हम फिर भी उपयोगी होंगे। यह बहुत पुराना कोड है इसलिए कृपया मुझे हराएं।

+0

हां, आपको डीएफए जैसे आईपी मॉड्यूल का उपयोग करना चाहिए। – deno

-1

आप glob निर्देशिका बिंग की कोशिश कर सकते हैं:

import os 
import glob 

modules = glob.glob(os.path.join('/some/path/to/modules', '*.py')) 

उसके बाद आप उन्हें आयात करने का प्रयास कर सकते हैं:

checked_modules 
for module in modules: 
    try: 
     __import__(module, globals(), locals()) # returns module object 
    except ImportError: 
     pass 
    else: 
     checked_modules.append(module) 
3

मुझे लगता है कि प्लगइन बात की इस तरह करने के लिए सबसे अच्छा तरीका है entry_points और उपयोग कर रहा है API for querying them

+0

यह स्वीकार्य उत्तर होना चाहिए। प्रवेश बिंदुओं के माध्यम से मॉड्यूल पंजीकृत करना एक अधिक स्पष्ट, जानबूझकर और पाइथोनिक दृष्टिकोण है जब आप रनटाइम पर उनको खोजना चाहते हैं, और उनमें से सभी को 'pkgutil.walk_packages'' के तरीके को आयात करने का दुष्प्रभाव नहीं है । –

1

सबमिड्यूल खोजने के लिए फाइल सिस्टम को पार करने के ऊपर दिए गए समाधान ठीक है जब तक आप प्रत्येक प्लगइन को फाइल सिस्टम आधारित मॉड्यूल के रूप में लागू करते हैं।

आपके मुख्य मॉड्यूल में एक अधिक लचीला तरीका एक स्पष्ट प्लगइन सूची होगी, और प्रत्येक प्लगइन (चाहे फ़ाइल द्वारा बनाई गई मॉड्यूल, गतिशील रूप से या यहां तक ​​कि एक वर्ग का उदाहरण भी हो) जो स्पष्ट रूप से उस सूची में स्वयं को जोड़ती है। शायद एक रजिस्टर प्लगइन समारोह के माध्यम से।

याद रखें: "स्पष्ट से स्पष्ट स्पष्ट है" पायथन के ज़ेन का हिस्सा है।

+0

इस काम के लिए आपको यह सुनिश्चित करने का एक तरीका है कि जब आप अपना ऐप शुरू करते हैं तो प्लगइन मॉड्यूल आयात किए जाते हैं, अन्यथा उन्हें खुद को पंजीकृत करने का मौका नहीं मिलेगा। यह चिकन और अंडे की समस्या है। ट्रैवर्सिंग/ऑटो आयात मॉड्यूल के बिना आप मैन्युअल रूप से अपने मुख्य मॉड्यूल में सभी मॉड्यूल आयात करते हैं, पंजीकरण फ़ंक्शन की आवश्यकता को अस्वीकार करते हैं लेकिन सिद्धांत को तोड़ते हैं कि मुख्य को विशिष्ट प्लगइन के बारे में जानने की आवश्यकता नहीं है – Anentropic

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