2011-09-28 30 views
58

मैं निम्नलिखित निर्देशिका संरचना के साथ एक अजगर आवेदन किया है:ImportError: - कोई मॉड्यूल नामित अजगर

src 
| 
+---- main 
| 
+---- util 
| 
+---- gen_py 
     | 
     +---- lib 

पैकेज मुख्य में, मैं जो एक आयात है MyServer.py नाम के एक अजगर मॉड्यूल है बयान की तरह:

from gen_py.lib import MyService 

इस बयान से काम करने के लिए आदेश में, मैं MyServer.py की शुरुआत में निम्न पंक्ति रखा:

import sys 
sys.path.append('../gen_py/lib') 

जब मैं टर्मिनल में MyServer.py चलाने के लिए, मैं निम्नलिखित त्रुटि हो:

ImportError: No module named gen_py.lib

क्या मैं यहाँ याद आ रही है?

+0

कमांड लाइन क्या थी जिसे आपने MyServer.py चलाने के लिए उपयोग किया था? आप किस निर्देशिका में थे? –

उत्तर

69

sys.path का आपका संशोधन मानता है कि वर्तमान कार्य निर्देशिका हमेशा main/ में होती है। यह मामला नहीं है। इसके बजाय, बस sys.path को मूल निर्देशिका जोड़ें:

import sys 
import os.path 

sys.path.append(os.path.join(os.path.dirname(__file__), '..')) 
import gen_py.lib 

मत भूलना gen_py और lib में एक फ़ाइल __init__.py शामिल करने के लिए - अन्यथा, उन्हें अजगर मॉड्यूल के रूप में मान्यता नहीं दी जाएगी।

+0

इससे मदद मिली है, धन्यवाद। –

+0

मुझे एक ही समस्या है। मैं विंडोज, ग्रहण का उपयोग करता हूं। ग्रहण में हमें क्या करना चाहिए? – Ayse

+0

@Ceren यह कोड प्रत्येक आईडीई में काम करना चाहिए। आपका आईडीई (या अधिक सटीक, इसके लिए पाइथन प्लगइन) वास्तव में पाइथन कोड निष्पादित नहीं कर सकता है, इस स्थिति में आपको शायद कहीं भी खोज पथ को कॉन्फ़िगर करने की आवश्यकता है। इसके बारे में [एक नया प्रश्न पूछें] (http://stackoverflow.com/questions/ask) के लिए स्वतंत्र महसूस करें। – phihag

6

पायथन मॉड्यूल आयात करने के लिए आयात करने के लिए, आपके पास "path_py/lib" नहीं, आपके पथ में "src" होना चाहिए।

जब import gen_py.lib की तरह एक आयात प्रसंस्करण, यह एक मॉड्यूल gen_py के लिए लग रहा है, तो एक submodule lib के लिए लग रहा है।

मॉड्यूल के रूप में gen_py "../gen_py/lib" (यह ".." में होगा) में नहीं होगा, आपके द्वारा जोड़ा गया पथ आयात प्रक्रिया में मदद करने के लिए कुछ भी नहीं करेगा।

इस पर निर्भर करता है कि आप कहां से इसे चला रहे हैं, "src" फ़ोल्डर में सापेक्ष पथ जोड़ने का प्रयास करें। शायद यह sys.path.append('..') है। तुम भी python main/MyServer.py

+0

मैंने इस sys.path.append ('../../ src/gen_py/lib') की कोशिश की लेकिन एक ही त्रुटि प्राप्त करें ... –

+0

यह मैंने नहीं कहा। यदि आप "gen_py.lib" आयात कर रहे हैं तो आप पथ में gen_py/lib को संलग्न नहीं करते हैं। आप फ़ोल्डर gen_py अंदर संलग्न है, जो इस मामले में शायद ".." है। – lunixbochs

5
from ..gen_py.lib import MyService 

या

from main.gen_py.lib import MyService 

की तरह सफलता स्क्रिप्ट जबकि src फ़ोल्डर के अंदर सीधे चल रहा है, संबंधित पथ के माध्यम से हो सकता है सुनिश्चित करें कि आप प्रत्येक निर्देशिका पर एक (कम से कम खाली) __init__.py फ़ाइल किया हुआ है ।

3

__init__.py शामिल करने के लिए है, जो बनाता है अजगर जानते हैं कि उन निर्देशिकाओं containpackages

3

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

सही करने की सही बात यह है: 1) वर्चुअलनव पायवेन-3.4 या कुछ समान 2) विकास मोड - $ पायथन सेटअप सक्रिय करें।पीई

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