我有一个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('..')))
不要这样做。相反,可以使用
$PYTHONPATH
在调用python
时强制插入基目录,或者使用该目录中的python -m model.car
。在你要做的是相对重要的。它在Python中工作得很好,但是在模块级别,而不是在文件系统级别。我知道,这很令人困惑。在
这意味着如果在子目录中运行脚本,它不会看到上面的dir,因为对于正在运行的脚本,模块的根是当前目录:没有上层模块。在
那么相对进口是为了什么呢?在
好吧,模块在子目录汽车导入模块在上目录,只要他们是他们自己从一个upperdir导入。在
在您的例子中,这意味着您必须从“/”运行脚本,这样它就成为模块的根,并且允许子模块使用相对导入。在
解决问题的一个可能的方法是删除
if __name__ == "__main__"
块并创建/测试.py公司名称:然后运行并启动所有测试。在
最终,您将希望自动化该过程,一个简单的解决方案是使用unittest,这样您就可以创建测试套件,只需添加要测试的模块名称:
^{pr2}$另一个解决方案(推荐)是使用诸如nose这样的工具来为您自动执行此操作。在
顺便说一句,避免}
from x import *
。这适用于快速脚本,但当程序增长时,您确实需要显式地命名导入的内容。import x
或{使用软件包。将一个
__init__.py
文件添加到您的工作目录和所有子文件夹中,如果您的导入在当前目录中找不到该模块,它将搜索父目录。在见http://www.network-theory.co.uk/docs/pytut/Packages.html
这个问题也是以下问题的副本:
Import a module from a relative path
相关问题 更多 >
编程相关推荐