2011-06-05 14 views
8

मुझे this मिला, लेकिन यह काफी नहीं है जो मैं करना चाहता हूं।निर्देशिका में सभी वर्गों को आयात करें?

मैं निर्देशिका में सभी फ़ाइलों में सभी कक्षाओं को आयात करना चाहता हूं। मूल रूप से, मैं इस बदलना चाहते हैं: कुछ गतिशील के साथ

from A import * 
from B import * 
from C import * 

, मैं एक अन्य फ़ाइल जोड़ें ताकि मैं अपने __init__.py हर बार संपादन रखने की जरूरत नहीं है।


glob समाधान

import A 
import B 
import C 

के बराबर है जो नहीं है सब पर एक ही हो रहा है।

+0

आप इसके साथ क्या हासिल करना चाहते हैं? –

+0

और इस उत्तर में क्या गलत है: http://stackoverflow.com/questions/1057431/loading-all-modules-in-a-folder-in-python/1057534#1057534? – viraptor

+0

@Ignacio: अंतिम वाक्य। मेरे पास लगभग 15 मॉडल हैं, और उनमें से सभी को हमेशा आयात करने की आवश्यकता है। जब यह प्रोग्रामेटिक रूप से किया जा सकता है तो मुझे '__init __। Py' को अद्यतन रखना जारी रखना मेरे लिए समझ में नहीं आता है। – mpen

उत्तर

6

आप ऐसा कुछ कर सकते हैं, हालांकि isinstance(cls, type) पर ध्यान रखें केवल नए-शैली के वर्गों के साथ काम करता है।

import os, sys 

path = os.path.dirname(os.path.abspath(__file__)) 

for py in [f[:-3] for f in os.listdir(path) if f.endswith('.py') and f != '__init__.py']: 
    mod = __import__('.'.join([__name__, py]), fromlist=[py]) 
    classes = [getattr(mod, x) for x in dir(mod) if isinstance(getattr(mod, x), type)] 
    for cls in classes: 
     setattr(sys.modules[__name__], cls.__name__, cls) 
+2

हां, मैंने यह जवाब देखा, यह काम नहीं करता है। यह मॉड्यूल आयात करता है, लेकिन कक्षाओं में नहीं। मुझे फ़ाइल को 'पता' एड्रेस 'के रूप में एक्सेस करना होगा, जबकि मुझे इसे' पता 'के साथ एक्सेस करने में सक्षम होना चाहिए। एक अंतर है – mpen

+0

आपको 'os.path.djoin (os.path.dirname (__ file__), '* .py') 'os.path.dirname (__ file__) +"/*। Py "के बजाय' 'का उपयोग करना चाहिए। –

+0

@ मार्क ने इसे प्रतिबिंबित करने के लिए मेरे उत्तर को समायोजित किया। – zeekay

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