在python库中导入模块的正确方法是什么?

时间:2013-12-26 10:55:59

标签: python

当你编写一个python库,并希望从另一个模块中导入一个模块时,这样做的正确方法是什么,这样当从外部导入库和从中运行某些单元测试时,导入都可以工作图书馆目录?

如果你这样做

import some_module
from some_module import something

从库directoy运行时可以正常工作,但从外部导入时会生成ImportError: No module named 'some_module'

你可以做到

from . import some_module
import my_library.some_other_module
from .some_module import something

但如果从位于同一目录中的unittest导入库,它将无效。

最后,您可以使用sys.path和/或将单元测试移动到其他目录。

什么是最好的解决方案?

编辑:为了说清楚,我想在库的顶层目录中使用python -m unittest运行单元测试。到目前为止,我通过添加

使其成功
import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

到单元测试文件的开头。作为替代方案,可以编写一个简短的shell脚本,将父目录添加到PYTHONPATH,然后运行unittests。我想知道是否有更好的方法来处理它?<​​/ p>

1 个答案:

答案 0 :(得分:0)

查看Module Search Path

上的文档
  

当导入名为spam的模块时,解释器首先进行搜索   对于具有该名称的内置模块。如果没有找到,则搜索   对于由。给出的目录列表中名为spam.py的文件   变量sys.path。 sys.path从这些位置初始化:

     
      
  • 包含输入脚本(或当前目录)的目录。
  •   
  • PYTHONPATH(目录名列表,语法与shell变量PATH相同)。
  •   
  • 依赖于安装的默认值。
  •   

如果你编写一个库,测试代码通常应该与库的用户相同的方式与库连接。这可能意味着通过设置PYTHONPATH环境变量或将模块安装在默认的第三方模块位置,将模块添加到搜索路径。

我建议从使用自动测试发现选项

保存模块的基目录运行测试
python -m unittest discover (python >= 2.7)

这将以递归方式查找与test_*.py匹配的文件(即在模块dirs中),但应设置相对于父目录的python路径。