2009-01-19 9 views
64

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

from sys import path 
from os import getcwd 
path.append(getcwd() + "\\models") #Yes, i'm on windows 
print path 
import user 

u=user.User() #error on this line 

और user.py:

class User(Entity): 
    using_options(tablename='users') 

    username = Field(String(15)) 
    password = Field(String(64)) 
    email = Field(String(50)) 
    status = Field(Integer) 
    created = Field(DateTime) 

त्रुटि है: AttributeError:

Server 
    -server.py 
    -Models 
     --user.py 

यहाँ server.py की सामग्री है: 'मॉड्यूल' यहाँ मेरी निर्देशिका संरचना है ऑब्जेक्ट में कोई विशेषता नहीं है 'उपयोगकर्ता'

+1

क्या आप त्रुटि संदेश पेस्ट कर सकते हैं? –

उत्तर

96

मुझे विश्वास है कि आपकोनामक फ़ाइल बनाने की आवश्यकता है मॉडल निर्देशिका मेंताकि पाइथन इसे मॉड्यूल के रूप में मान सके।

तो फिर तुम कर सकते हैं:

from Models.user import User 

आप __init__.py (उदाहरण के लिए प्रवर्तन कोड है कि कुछ ही विभिन्न वर्गों की जरूरत है) में कोड शामिल कर सकते हैं या इसे खाली छोड़ दें। लेकिन यह वहां होना चाहिए।

+1

धन्यवाद, मैंने इससे पहले पैकेजों के बारे में कभी नहीं सुना था। – ryeguy

+0

दरअसल, जब पाइथन आयात करते हैं तो blah.py और blah/__ init__.py बिल्कुल वही व्यवहार करता है। –

+1

यह अनजान था ... और मैं खुद से कहता हूं: आरटीएफएम एफएमएफ –

20

आपको Models उपफोल्डर पर __init__.py बनाना होगा। फ़ाइल खाली हो सकती है। यह एक पैकेज को परिभाषित करता है।

तो फिर तुम कर सकते हैं:

from Models.user import User 

अजगर ट्यूटोरियल, here में इसके बारे में सब पढ़ें।

पायथन परियोजनाओं here के फ़ाइल संगठन के बारे में भी एक अच्छा लेख है।

+0

क्या होगा यदि फ़ाइल खाली नहीं है? – darkgaze

7

आप __init__.py गायब हैं। अजगर ट्यूटोरियल से:

The __init__.py files are required to make Python treat the directories as containing packages; this is done to prevent directories with a common name, such as string, from unintentionally hiding valid modules that occur later on the module search path. In the simplest case, __init__.py can just be an empty file, but it can also execute initialization code for the package or set the __all__ variable, described later.

एक खाली अपने मॉडल निर्देशिका में __init__.py नामक फ़ाइल रखो, और सब सुनहरा होना चाहिए।

10

import user

u=user.User() #error on this line

वजह से __init__ की कमी ऊपर उल्लेख किया है, तो आप एक ImportError जो समस्या स्पष्ट होगा उम्मीद करेंगे।

आपको कोई नहीं मिलता क्योंकि 'उपयोगकर्ता' मानक लाइब्रेरी में एक मौजूदा मॉड्यूल भी है। आपका आयात विवरण उसको पकड़ लेता है और इसके अंदर उपयोगकर्ता वर्ग को खोजने का प्रयास करता है; यह अस्तित्व में नहीं है और केवल तभी आपको त्रुटि मिलती है।

यह आम तौर पर एक अच्छा विचार है अपने आयात पूर्ण बनाने के लिए है:

import Server.Models.user 

अस्पष्टता के इस प्रकार से बचने के लिए। वास्तव में पायथन 2.7 'आयात उपयोगकर्ता' से वर्तमान मॉड्यूल के सापेक्ष नहीं दिखेंगे।

यदि आप वास्तव में सापेक्ष आयात चाहते हैं, तो आप उन्हें स्पष्ट रूप से पायथन 2 में रख सकते हैं।5 और ऊपर कुछ हद तक बदसूरत सिंटैक्स का उपयोग:

from .user import User 
6

एक पैरेंट फ़ोल्डर पर स्थित एक मॉड्यूल आयात करने के लिए सही तरीके से, जब आप एक मानक पैकेज संरचना की जरूरत नहीं है, यह है:

import os, sys 
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) 
sys.path.append(os.path.dirname(CURRENT_DIR)) 

(आप अंतिम दो लाइनों को विलय कर सकते हैं लेकिन इस तरह समझना आसान है)।

यह समाधान क्रॉस-प्लेटफॉर्म है और अन्य परिस्थितियों में संशोधित करने की आवश्यकता के लिए पर्याप्त सामान्य है।

0

ग्लैरेन द्वारा समाधान सबसे अच्छा काम करता है। मैं पाइथन के मुद्दे में भाग गया जो मेरे पायथन मॉड्यूल को पहचानने में असमर्थ था और मुझे 'मॉड्यूल नहीं मिला' त्रुटि मिली। मेरे लिए, __init__.py फ़ाइलों को जोड़ने और मॉड्यूल को उचित रूप से आयात करने के बाद भी, मुझे अभी भी वही त्रुटि मिली है। मैंने ग्लैरेन के जवाब का पालन करके इस मुद्दे को हल किया।

+0

यह उनके उत्तर पर सबसे अच्छा टिप्पणी हो सकता था। – Ben

1

आप पैरामीटर os.path.dirname .... आदेश कैसे लिखते हैं?

import os, sys 
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) 
sys.path.append(os.path.dirname(CURRENT_DIR)) 
0

मेरे पसंदीदा तरीका हर निर्देशिका कि मॉड्यूल है कि अन्य मॉड्यूल से आदत हो होता है पर __init__.py के लिए है, और प्रवेश बिंदु में, ओवरराइड sys.path नीचे के रूप में:

def get_path(ss): 
    return os.path.join(os.path.dirname(__file__), ss) 
sys.path += [ 
    get_path('Server'), 
    get_path('Models') 
] 

यह आयात के लिए दृश्यमान निर्देशिका में फ़ाइलों को बनाता है, और मैं सर्वर को सर्वर.py से आयात कर सकता हूं।

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

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