Python“导入错误:未命名模块”问题
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3646307/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Python "ImportError: No module named" Problem
提问by duffymo
I'm running Python 2.6.1 on Windows XP SP3. My IDE is PyCharm 1.0-Beta 2 build PY-96.1055.
我在 Windows XP SP3 上运行 Python 2.6.1。我的 IDE 是 PyCharm 1.0-Beta 2 build PY-96.1055。
I'm storing my .py files in a directory named "src"; it has an __init__.pyfile that's empty except for an "__author__" attribute at the top.
我将 .py 文件存储在名为“src”的目录中;它有一个__init__.py空文件,除了__author__顶部的“ ”属性。
One of them is called Matrix.py:
其中之一称为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()
I've created a new directory named "test" that also has an __init__.pyfile that's empty except for an "__author__" attribute at the top. I've created a MatrixTest.py to unit my Matrix class:
我创建了一个名为“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)
Yet when I try to run my MatrixTest I get this error:
然而,当我尝试运行我的 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
Everything I've read tells me that having the init.py in all my directories should take care of this.
我读过的一切都告诉我,在我的所有目录中都有init.py 应该解决这个问题。
If someone could point out what I've missed I'd greatly appreciate it.
如果有人能指出我遗漏了什么,我将不胜感激。
I'd also like advice on the best way to develop and maintain source and unit test classes. I'm thinking about this the way I usually do when I write Java: /src and /test directories, with identical package structures underneath. Is this "Pythonic" thinking, or should I consider another organization scheme?
我还希望获得有关开发和维护源代码和单元测试类的最佳方法的建议。我在考虑这个问题时,我通常在编写 Java 时会这样做: /src 和 /test 目录,下面有相同的包结构。这是“Pythonic”思维,还是我应该考虑另一种组织方案?
UPDATE:
更新:
Thanks to those who have answered, here's the solution that worked for me:
感谢那些回答的人,这是对我有用的解决方案:
- Change import to
from src import Matrix # Matrix class to be tested - Add
sys.pathas an environment variable to my unittest configuration, with ./src and ./test directories separated by semi-colon. - Change declarations in MatrixTest.py as shown.
- 将导入更改为
from src import Matrix # Matrix class to be tested sys.path作为环境变量添加到我的 unittest 配置中,./src 和 ./test 目录用分号分隔。- 更改 MatrixTest.py 中的声明,如图所示。
采纳答案by unutbu
This is a bit of a guess, but I think you need to change your PYTHONPATHenvironment variable to include the src and test directories.
这有点猜测,但我认为您需要 更改 PYTHONPATH环境变量以包含 src 和 test 目录。
Running programs in the srcdirectory may have been working, because Python automatically inserts the directory of the script it is currently running into sys.path. So importing modules in srcwould have worked as long as you are also executing a script that resides in src.
src目录中运行的程序可能一直在运行,因为 Python 会自动将当前运行的脚本目录插入到sys.path. 因此src,只要您还执行驻留在src.
But now that you are running a script from test, the testdirectory is automatically added to sys.path, while srcis not.
但是现在您正在从 运行脚本test,test目录会自动添加到sys.path,而src不会。
All directories listed in PYTHONPATH get added to sys.path, and Python searches sys.pathto find modules.
PYTHONPATH 中列出的所有目录都被添加到sys.path,并且 Python 搜索sys.path以查找模块。
Also, if you say
另外,如果你说
from src import Matrix
then Matrixwould refer to the package, and you'd need to say Matrix.Matrixto access the class.
然后Matrix会引用包,你需要说Matrix.Matrix访问类。
回答by Cristian Ciupitu
Regarding best practices, PycURLuses a testsdirectory at the same level as the main source code. On the other hand projects like Twistedor sorl-thumbnailuse a test(s)subdirectory under the main source code.
关于最佳实践,PycURL使用tests与主要源代码处于同一级别的目录。另一方面,像Twisted或sorl-thumbnail这样的项目使用test(s)主源代码下的子目录。
The other half of the question has been already answered by ~unutbu.
~unutbu已经回答了问题的另一半。

