2010-09-05 21 views
11

मैं विंडोज एक्सपी एसपी 3 पर पायथन 2.6.1 चला रहा हूं। मेरा आईडीई PyCharm 1.0-बीटा 2 बिल्ड पीवाई -96.1055 है।पायथन "आयात त्रुटि: कोई मॉड्यूल नाम नहीं" समस्या

मैं अपनी .py फ़ाइलों को "src" नामक निर्देशिका में संग्रहीत कर रहा हूं; इसमें __init__.py फ़ाइल है जो शीर्ष पर "__author__" विशेषता को छोड़कर खाली है।

उनमें से एक Matrix.py कहा जाता है:

#!/usr/bin/env python 
""" 
"Core Python Programming" chapter 6. 
A simple Matrix class that allows addition and multiplication 
""" 
__author__ = 'Michael' 
__credits__ = [] 
__version__ = "1.0" 
__maintainer__ = "Michael" 
__status__ = "Development" 

class Matrix(object): 
    """ 
    exercise 6.16: MxN matrix addition and multiplication 
    """ 
    def __init__(self, rows, cols, values = []): 
     self.rows = rows 
     self.cols = cols 
     self.matrix = values 

    def show(self): 
     """ display matrix""" 
     print '[' 
     for i in range(0, self.rows): 
      print '(', 
      for j in range(0, self.cols-1): 
       print self.matrix[i][j], ',', 
      print self.matrix[i][self.cols-1], ')' 
     print ']' 

    def get(self, row, col): 
     return self.matrix[row][col] 

    def set(self, row, col, value): 
     self.matrix[row][col] = value 

    def rows(self): 
     return self.rows 

    def cols(self): 
     return self.cols 

    def add(self, other): 
     result = [] 
     for i in range(0, self.rows): 
      row = [] 
      for j in range(0, self.cols): 
       row.append(self.matrix[i][j] + other.get(i, j)) 
      result.append(row) 
     return Matrix(self.rows, self.cols, result) 

    def mul(self, other): 
     result = [] 
     for i in range(0, self.rows): 
      row = [] 
      for j in range(0, other.cols): 
       sum = 0 
       for k in range(0, self.cols): 
        sum += self.matrix[i][k]*other.get(k,j) 
       row.append(sum) 
      result.append(row) 
     return Matrix(self.rows, other.cols, result) 

    def __cmp__(self, other): 
     """ 
     deep equals between two matricies 
     first check rows, then cols, then values 
     """ 
     if self.rows != other.rows: 
      return self.rows.cmp(other.rows) 
     if self.cols != other.cols: 
      return self.cols.cmp(other.cols) 
     for i in range(0, self.rows): 
      for j in range(0, self.cols): 
       if self.matrix[i][j] != other.get(i,j): 
        return self.matrix[i][j] == (other.get(i,j)) 
     return True # if you get here, it means size and values are equal 



if __name__ == '__main__': 
    a = Matrix(3, 3, [[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 
    b = Matrix(3, 3, [[6, 5, 4], [1, 1, 1], [2, 1, 0]]) 
    c = Matrix(3, 3, [[2, 0, 0], [0, 2, 0], [0, 0, 2]]) 
    a.show() 
    b.show() 
    c.show() 
    a.add(b).show() 
    a.mul(c).show() 

मैं "परीक्षण" नामक एक नया निर्देशिका भी एक __init__.py फ़ाइल है कि शीर्ष पर एक "__author__" विशेषता को छोड़कर यह खाली है है कि बना लिया है। मैं एक MatrixTest.py इकाई के लिए अपने मैट्रिक्स वर्ग बना लिया है:

#!/usr/bin/env python 
""" 
Unit test case for Matrix class 
See http://jaynes.colorado.edu/PythonGuidelines.html#module_formatting for Python coding guidelines 
""" 

import unittest #use my unittestfp instead for floating point 
from src import Matrix # Matrix class to be tested 

__author__ = 'Michael' 
__credits__ = [] 
__license__ = "GPL" 
__version__ = "1.0" 
__maintainer__ = "Michael" 
__status__ = "Development" 

class MatrixTest(unittest.TestCase): 
    """Unit tests for Matrix class""" 
    def setUp(self): 
     self.a = Matrix.Matrix(3, 3, [[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 
     self.b = Matrix.Matrix(3, 3, [[6, 5, 4], [1, 1, 1], [2, 1, 0]]) 
     self.c = Matrix.Matrix(3, 3, [[2, 0, 0], [0, 2, 0], [0, 0, 2]]) 

    def testAdd(self): 
     expected = Matrix.Matrix(3, 3, [[7, 7, 7], [5, 6, 7], [9, 9, 9]]) # need to learn how to write equals for Matrix 
     self.a.add(self.b) 
     assert self.a == expected 

if __name__ == '__main__': #run tests if called from command-line 
    suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions) 
    unittest.TextTestRunner(verbosity=2).run(suite) 

फिर भी जब मैं अपने MatrixTest चलाने के लिए मैं इस त्रुटि मिलती है कोशिश:

C:\Tools\Python-2.6.1\python.exe "C:/Documents and Settings/Michael/My Documents/Projects/Python/learning/core/test/MatrixTest.py" 
Traceback (most recent call last): 
    File "C:/Documents and Settings/Michael/My Documents/Projects/Python/learning/core/test/MatrixTest.py", line 8, in <module> 
    from src import Matrix # Matrix class to be tested 
ImportError: No module named src 

Process finished with exit code 1 

सब कुछ मैं पढ़ा है मुझे होने कि बताता है init .py मेरी सभी निर्देशिकाओं में इसका ध्यान रखना चाहिए।

अगर कोई यह बता सकता है कि मुझे क्या याद आया है तो मैं इसकी सराहना करता हूं।

मैं स्रोत और इकाई परीक्षण कक्षाओं को विकसित और बनाए रखने के सर्वोत्तम तरीके पर सलाह भी चाहूंगा। मैं इस बारे में सोच रहा हूं कि जब मैं जावा लिखता हूं:/src और/test निर्देशिका, नीचे समान पैकेज संरचनाओं के साथ। क्या यह "पायथनिक" सोच है, या क्या मुझे एक और संगठन योजना पर विचार करना चाहिए?

अद्यतन:

जो लोग जवाब दे दिया है के लिए धन्यवाद, यहाँ समाधान है कि मेरे लिए काम किया है:

  1. आयात बदलें from src import Matrix # Matrix class to be tested
  2. को sys.path मेरी unittest विन्यास के लिए एक वातावरण चर के रूप में, के साथ अर्ध-कॉलन से अलग ./src और ./test निर्देशिकाएं।
  3. दिखाए गए अनुसार MatrixTest.py में घोषणाएं बदलें।
+0

आप कहते हैं कि आपकी फ़ाइलें एक src फ़ोल्डर में संग्रहीत हैं? सी: \ टूल्स \ पायथन-2.6.1 \ python.exe "सी:/दस्तावेज़ और सेटिंग्स/माइकल/मेरे दस्तावेज़/परियोजनाएं/पायथन/सीखना/कोर/परीक्षण/MatrixTest.py" – awithrow

+1

'python -m test.MatrixTest का प्रयोग करें '। Http://stackoverflow.com/questions/24622041/python-importing-a- मॉड्यूल-from-a-parallel-directory – jrc

उत्तर

14

यह एक अनुमान का एक सा है, लेकिन मैं आपको change your PYTHONPATH वातावरण चर की जरूरत src और परीक्षण निर्देशिका में शामिल करने के बारे में सोचो।

src निर्देशिका में चल रहे प्रोग्राम काम कर रहे हैं, क्योंकि पाइथन स्वचालित रूप से उस स्क्रिप्ट की निर्देशिका को सम्मिलित करता है जो वर्तमान में sys.path में चल रहा है। इसलिए src में मॉड्यूल आयात करना तब तक काम करेगा जब तक आप src में रहने वाली स्क्रिप्ट को निष्पादित कर रहे हों।

लेकिन अब जबकि आप test से एक स्क्रिप्ट चला रहे हैं, test निर्देशिका स्वचालित रूप से, sys.path में जोड़ा जाता है, जबकि src नहीं है।

PYTHONPATH में सूचीबद्ध सभी निर्देशिकाओं को sys.path में जोड़ा गया है, और पाइथन मॉड्यूल खोजने के लिए sys.path खोजता है।

इसके अलावा

, अगर आप कहते हैं कि

from src import Matrix 

तो Matrix पैकेज को उल्लेख करता है, और आप कक्षा तक पहुँचने के लिए Matrix.Matrix कहने की जरूरत होगी।

+0

@ क्रिस्टियन: मैंने 'आयात sys डाला; test.py. नामक फ़ाइल में प्रिंट (sys.path) '। तब मैं 'सीडी/कुछ/अन्य/डीआईआर भाग गया; पायथन/पथ/से/test.py'। सूचीबद्ध पहला पथ '/ path/to' है, नहीं '/ कुछ/अन्य/dir'। तो यह स्क्रिप्ट की निर्देशिका प्रतीत होता है, सीडब्ल्यूडी नहीं जो 'sys.path' में जोड़ा जाता है। – unutbu

+0

@ ~ unutbu: तुम सही हो! मेरी टिप्पणी का कारण [ट्यूटोरियल] (http://docs.python.org/tutorial/modules.html#the-module-search-path) से इस स्निपेट था: "जब स्पैम नामक एक मॉड्यूल आयात किया जाता है, तो दुभाषिया * वर्तमान निर्देशिका * में spam.py नामक फ़ाइल की खोज करता है, और उसके बाद पर्यावरण चर PYTHONPATH द्वारा निर्दिष्ट निर्देशिकाओं की सूची में। " मुझे लगता है कि किसी को इसे कम अस्पष्ट तरीके से दोहराया जाना चाहिए। –

+1

@ क्रिस्टियन: हम्म, यह निश्चित रूप से भ्रमित है। (हालांकि, यह दूसरे अनुच्छेद में स्पष्ट करने की कोशिश करता है)। दस्तावेज़ों का एक और लिंक यहां दिया गया है; यह मुझे लगता है कि स्पष्ट है: http://docs.python.org/library/sys.html#sys.path – unutbu

1

सर्वोत्तम प्रथाओं के संबंध में, PycURL मुख्य स्रोत कोड के समान स्तर पर tests निर्देशिका का उपयोग करता है। दूसरी ओर Twisted या sorl-thumbnail जैसी परियोजनाएं मुख्य स्रोत कोड के तहत test(s) उपनिर्देशिका का उपयोग करें।

प्रश्न का दूसरा आधा पहले से ही ~unutbu द्वारा उत्तर दिया गया है।

+1

हाय ईसाई, उदाहरण के लिए धन्यवाद। मैं इसे करने के तरीके को पसंद करता हूं:/src और/test उसी स्तर पर। – duffymo

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