我花了很多时间研究这个,但仍然无法理解为什么我一直在使用ImportErrors:没有名为...的模块
我的文件结构如下:
/Package
/mode
__init__.py
moduletoimport.py
/test
__init__.py
abc.py
文件moduletoimport.py
包含:
class ClassToImport(object):
def test(self):
return True
文件abc.py
包含以下代码:
from mode.moduletoimport import ClassToImport
从终端我输入:
python abc.py
这里的目的是导入目录上的模块。
答案 0 :(得分:0)
对此问题的快速解决方法是,在文件abc.py
中将以下内容添加到文件顶部:
import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))
然而,这真的不是那么正确。我对你构建项目的方式有一些严肃的问题,并相信下面的部分会有很大的帮助。
通常,如果您要设计要导入的模块,您希望项目结构如下所示:
package_name/
/* setup.py and other misc files */
package_name/
__init__.py
/* module files go here */
test/
/* tests go here */
顶级package_name/
实际上只是用于持有项目。它将包含您的setup.py
,可能包含配置等。
在顶层下方,我们有另一个名为package_name
的目录。这是你所有的实际python代码将去的地方。
同样在顶层下方,我们有另一个名为test
的目录。这是所有测试应该去的地方。我强烈建议使用nose来测试你的python应用程序。
让我们快速举例说明您要完成的任务。最终产品将具有以下结构/文件:
my_project/
my_project/
__init__.py
my_class.py
test/
test_my_class.py
my_class.py
的内容是:
class MyClass(object):
def test(self):
return True
test_my_class.py
的内容是:
import unittest
from my_project.my_class import MyClass
class TestMyClass(unittest.TestCase):
def test_my_class(self):
c = MyClass()
self.assertEqual(c.test(), True)
现在,如果您install nose,您应该能够(从项目的顶层)运行nosetests
。
有很多关于如何做到这一点的教程。但为了简洁起见,我会让你自己做一些搜索。
希望这有帮助。