Python嵌套模块

时间:2015-09-02 20:32:46

标签: python module packages

我花了很多时间研究这个,但仍然无法理解为什么我一直在使用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

这里的目的是导入目录上的模块。

1 个答案:

答案 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

有很多关于如何做到这一点的教程。但为了简洁起见,我会让你自己做一些搜索。

希望这有帮助。