代码之家  ›  专栏  ›  技术社区  ›  duffymo

Python“ImportError:No module named”问题

  •  17
  • duffymo  · 技术社区  · 14 年前

    我将我的.py文件存储在一个名为“src”的目录中;它有一个 __init__.py 文件为空,除了“ __author__ “属性位于顶部。

    其中一个叫做矩阵.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()
    

    我已经创建了一个名为“test”的新目录,它还有一个 __初始值 文件为空,除了“ “属性位于顶部。我创造了一个矩阵测试.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
    

    我读到的所有东西都告诉我 初始化 我所有目录中的.py都应该处理这个问题。

    如果有人能指出我错过了什么,我将不胜感激。

    我还想知道开发和维护源代码和单元测试类的最佳方法。当我编写Java:/src和/test目录时,我通常是这样想的,下面有相同的包结构。这是“蟒蛇式”思维,还是我应该考虑另一个组织方案?

    更新:

    感谢那些回答我的人,以下是对我有效的解决方案:

    1. 将导入更改为 from src import Matrix # Matrix class to be tested
    2. 添加 sys.path 作为unittest配置的环境变量,用分号分隔./src和./test目录。
    3. 中的更改声明矩阵测试.py如图所示。
    2 回复  |  直到 14 年前
        1
  •  17
  •   unutbu    14 年前

    change your PYTHONPATH

    在中运行程序 src 目录可能一直在工作,因为Python会自动插入它当前运行的脚本的目录 sys.path . 所以在中导入模块 src公司 只要您同时执行驻留在

    但是现在你正在运行一个脚本 test ,的 测试 搜索路径 ,而 src公司 不是。

    搜索路径 搜索路径 查找模块。

    还有,如果你说

    from src import Matrix
    

    然后 Matrix 会提到包裹,你需要说 Matrix.Matrix

        2
  •  1
  •   Seaux    7 年前

    关于最佳实践, PycURL 使用 tests Twisted sorl-thumbnail test(s) 子目录下的主源代码。

    这个问题的另一半已经由 ~unutbu