Python "导入错误:没有名为的模块" 问题
我在Windows XP SP3上运行Python 2.6.1,使用的开发工具是PyCharm 1.0-Beta 2版本。
我的.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__
”属性。为了测试我的Matrix类,我还创建了一个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
文件就应该没问题。
如果有人能指出我遗漏了什么,我会非常感激。
我还想请教一下,开发和维护源代码以及单元测试类的最佳方法是什么。我考虑的方式和写Java时一样:/src和/test文件夹,下面有相同的包结构。这种想法算不算“Pythonic”,还是说我应该考虑其他的组织方式?
更新:
感谢那些回答我的人,这里是对我有效的解决方案:
- 将导入改为
from src import Matrix # 要测试的Matrix类
- 在我的unittest配置中添加
sys.path
作为环境变量,./src和./test文件夹用分号分隔。 - 按照示例修改MatrixTest.py中的声明。
2 个回答
关于最佳实践,PycURL 在主源代码的同一级别上使用了一个 tests
目录。而像 Twisted 或 sorl-thumbnail 这样的项目则在主源代码下使用了一个 test(s)
子目录。
问题的另一半已经由 ~unutbu 回答过了。
这有点猜测,但我觉得你需要修改一下你的 PYTHONPATH 环境变量,把 src 和 test 这两个文件夹加进去。
在 src
文件夹里运行程序可能之前一直没问题,因为 Python 会自动把它正在运行的脚本所在的文件夹加到 sys.path
里。所以只要你在 src
里执行脚本,导入模块就能正常工作。
但是现在你从 test
文件夹运行脚本,test
文件夹会自动被加到 sys.path
里,而 src
就不会了。
PYTHONPATH 里列出的所有文件夹都会被加到 sys.path
里,Python 会在 sys.path
里查找模块。
另外,如果你这样说
from src import Matrix
那么 Matrix
就指的是这个包,你需要说 Matrix.Matrix
才能访问到这个类。