当你编写一个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>
答案 0 :(得分:0)
当导入名为spam的模块时,解释器首先进行搜索 对于具有该名称的内置模块。如果没有找到,则搜索 对于由。给出的目录列表中名为spam.py的文件 变量sys.path。 sys.path从这些位置初始化:
- 包含输入脚本(或当前目录)的目录。
- PYTHONPATH(目录名列表,语法与shell变量PATH相同)。
- 依赖于安装的默认值。
如果你编写一个库,测试代码通常应该与库的用户相同的方式与库连接。这可能意味着通过设置PYTHONPATH环境变量或将模块安装在默认的第三方模块位置,将模块添加到搜索路径。
我建议从使用自动测试发现选项
保存模块的基目录运行测试python -m unittest discover (python >= 2.7)
这将以递归方式查找与test_*.py
匹配的文件(即在模块dirs中),但应设置相对于父目录的python路径。