当前位置:  开发笔记 > 编程语言 > 正文

Python"ImportError:没有模块命名"问题

如何解决《Python"ImportError:没有模块命名"问题》经验,为你挑选了1个好方法。

我在Windows XP SP3上运行Python 2.6.1.我的IDE是PyCharm 1.0-Beta 2 build PY-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()

我创建了一个名为"test"的新目录,该目录还有一个__init__.py空的文件,除了__author__顶部的" "属性.我创建了一个MatrixTest.py来组合我的Matrix类:

#!/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 
    from src import Matrix # Matrix class to be tested
ImportError: No module named src

Process finished with exit code 1

我读过的所有内容都告诉我,在我的所有目录中都有init .py可以解决这个问题.

如果有人能指出我错过了什么,我会非常感激.

我也喜欢有关开发和维护源代码和单元测试类的最佳方法的建议.我在编写Java时通常会这样做:/ src和/ test目录,下面有相同的包结构.这是"Pythonic"的想法,还是我应该考虑另一种组织方案?

更新:

感谢那些已经回答的人,这里有适合我的解决方案:

    将导入更改为 from src import Matrix # Matrix class to be tested

    添加sys.path为我的unittest配置的环境变量,其中./src和./test目录用分号分隔.

    如图所示更改MatrixTest.py中的声明.

unutbu.. 17

这是一个猜测,但我认为您需要 更改您的PYTHONPATH环境变量以包含src和测试目录.

src目录中运行程序可能一直有效,因为Python会自动插入当前运行的脚本目录sys.path.因此src,只要您还在执行驻留的脚本,导入模块就会起作用src.

但是现在您正在运行脚本test,该test目录会自动添加到sys.path,而src不是.

PYTHONPATH中列出的所有目录都被添加到sys.path,并且Python搜索sys.path以查找模块.

另外,如果你说

from src import Matrix

然后Matrix会引用包,你需要说Matrix.Matrix要访问该类.



1> unutbu..:

这是一个猜测,但我认为您需要 更改您的PYTHONPATH环境变量以包含src和测试目录.

src目录中运行程序可能一直有效,因为Python会自动插入当前运行的脚本目录sys.path.因此src,只要您还在执行驻留的脚本,导入模块就会起作用src.

但是现在您正在运行脚本test,该test目录会自动添加到sys.path,而src不是.

PYTHONPATH中列出的所有目录都被添加到sys.path,并且Python搜索sys.path以查找模块.

另外,如果你说

from src import Matrix

然后Matrix会引用包,你需要说Matrix.Matrix要访问该类.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有