【问题标题】:Python Nesting ModulesPython 嵌套模块
【发布时间】:2015-09-03 05:31:33
【问题描述】:

我花了很多时间研究这个,但仍然无法理解为什么我不断收到 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

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

【问题讨论】:

  • Package 目录是否位于sys.path 上?
  • 这似乎是一种非常奇怪的方式来构建您的项目。看看例如jeffknupp.com/blog/2013/08/16/…
  • 谢谢。将重新考虑我的项目结构。

标签: python module packages


【解决方案1】:

快速修复

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

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

希望这会有所帮助。

【讨论】:

  • 太好了!非常感谢您抽出宝贵时间以如此详细的方式回答问题!我会重新考虑我的项目结构!
猜你喜欢
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多