Python“ImportError: No module named”问题
Posted
技术标签:
【中文标题】Python“ImportError: No module named”问题【英文标题】:Python "ImportError: No module named" Problem 【发布时间】:2011-04-08 11:02:54 【问题描述】:我在 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 <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 class to be tested
将sys.path
作为环境变量添加到我的unittest 配置中,./src 和./test 目录用分号分隔。
如图所示更改 MatrixTest.py 中的声明。
【问题讨论】:
您说您的文件存储在 src 文件夹中? C:\Tools\Python-2.6.1\python.exe "C:/Documents and Settings/Michael/My Documents/Projects/Python/learning/core/test/MatrixTest.py" 使用python -m test.MatrixTest
。见***.com/questions/24622041/…
【参考方案1】:
这有点猜测,但我认为你需要 change your PYTHONPATH 环境变量包含 src 和 test 目录。
src
目录中运行的程序可能一直在运行,因为 Python 会自动将它当前运行的脚本目录插入到sys.path
。因此,只要您还执行驻留在 src
中的脚本,在 src
中导入模块就可以了。
但现在您从test
运行脚本,test
目录会自动添加到sys.path
,而src
不会。
PYTHONPATH 中列出的所有目录都添加到 sys.path
,Python 搜索 sys.path
以查找模块。
另外,如果你说
from src import Matrix
然后Matrix
将引用包,您需要说Matrix.Matrix
才能访问该类。
【讨论】:
@Cristian:我将import sys; print(sys.path)
放在一个名为 test.py 的文件中。然后我跑了cd /some/other/dir; python /path/to/test.py
。列出的第一个路径是/path/to
,而不是/some/other/dir
。所以它出现的是脚本的目录,而不是添加到sys.path
的CWD。span>
@~unutbu:你是对的!我发表评论的原因是来自tutorial 的这个 sn-p:“当导入名为 spam 的模块时,解释器在 当前目录 中搜索名为 spam.py 的文件,然后在由环境变量 PYTHONPATH 指定的目录列表。”。我想有人应该用不那么模棱两可的方式改写它。
@Cristian:嗯,这确实令人困惑。 (虽然,它试图在第二段中澄清)。这是文档的另一个链接;这个我觉得更清楚:docs.python.org/library/sys.html#sys.path
谢谢你,~unutbu。您和 Christian Ciupitu 引导我找到的解决方案已添加到我的问题中。
@~unutbu:是的,第二段澄清了一些事情,虽然当我很久以前阅读教程时,它并不存在,或者我不知何故跳过了它。无论如何,我向文档团队报告了这一点,也许他们会改写该部分以使其更清晰。另外,感谢sys.path
链接!【参考方案2】:
关于最佳实践,PycURL 使用与主要源代码处于同一级别的tests
目录。另一方面,像Twisted 或sorl-thumbnail 这样的项目在主源代码下使用test(s)
子目录。
~unutbu已经回答了另一半问题。
【讨论】:
嗨克里斯蒂安,谢谢你的例子。我更喜欢你这样做的方式:/src 和 /test 在同一级别。以上是关于Python“ImportError: No module named”问题的主要内容,如果未能解决你的问题,请参考以下文章