使用doctest在Python项目中导入

2024-04-24 03:18:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python项目,其目录结构如下:

/(some files)
/model/(python files)
/tools/(more python files)
...

所以,我在几个子目录中有Python文件,其中有一些 目录之间的依赖关系:工具被模型使用,等等 我的问题是我想对模型和工具进行doctest, 我希望能够像这样从命令行运行测试:/model/汽车.py。 我可以做到这一点,但只能用混乱的样板代码。我想 要知道什么是正确的方法,或者有没有?在

问题:我应该如何编写导入?在

萨克斯。这里有一个例子。。。在

工具的内容/工具.py

^{pr2}$

。。。和模型/汽车.py

#!/usr/bin/env python   
"""
   >>> car = Car()
   >>> car.ok()
   True
"""

from tools.tool import *

class Car(object):
    def __init__(self):
        self.tire_count = 4
    def ok(self):
        return is_four(self.tire_count)

if __name__ == '__main__':
    import doctest
    doctest.testmod()

通过在汽车.py它很管用,但看起来不好看。:(

if __name__ == '__main__':
    import sys
    import os
    sys.path.append(os.path.abspath(os.path.dirname('..')))

Tags: 工具pathpy模型importself目录model
3条回答

不要这样做。相反,可以使用$PYTHONPATH在调用python时强制插入基目录,或者使用该目录中的python -m model.car。在

你要做的是相对重要的。它在Python中工作得很好,但是在模块级别,而不是在文件系统级别。我知道,这很令人困惑。在

这意味着如果在子目录中运行脚本,它不会看到上面的dir,因为对于正在运行的脚本,模块的根是当前目录:没有上层模块。在

那么相对进口是为了什么呢?在

好吧,模块在子目录汽车导入模块在上目录,只要他们是他们自己从一个upperdir导入。在

在您的例子中,这意味着您必须从“/”运行脚本,这样它就成为模块的根,并且允许子模块使用相对导入。在

解决问题的一个可能的方法是删除if __name__ == "__main__"块并创建/测试.py公司名称:

import doctest
from model import car
from tools import tool

doctest.testmod(car)
doctest.testmod(tool)

然后运行并启动所有测试。在

最终,您将希望自动化该过程,一个简单的解决方案是使用unittest,这样您就可以创建测试套件,只需添加要测试的模块名称:

^{pr2}$

另一个解决方案(推荐)是使用诸如nose这样的工具来为您自动执行此操作。在

easy_install nose
nosetests  with-doctest # done :-)

顺便说一句,避免from x import *。这适用于快速脚本,但当程序增长时,您确实需要显式地命名导入的内容。import x或{}

使用软件包。将一个__init__.py文件添加到您的工作目录和所有子文件夹中,如果您的导入在当前目录中找不到该模块,它将搜索父目录。在

http://www.network-theory.co.uk/docs/pytut/Packages.html

这个问题也是以下问题的副本:

Import a module from a relative path

相关问题 更多 >