Python 嵌套模块

Python Nesting Modules

我花了很多时间研究这个,但仍然不明白为什么我一直收到 ImportErrors: No module named ...

我的文件结构如下:

/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

此处的目的是导入目录上的模块。

快速修复

此问题的快速解决方法是,在文件 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 应用程序。

例子

让我们构建一个您要完成的快速示例。最终产品将具有以下 structure/files:

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

关于如何执行此操作的教程有很多。但为了简洁起见,我将让您自己进行一些搜索。

希望对您有所帮助。