繁体   English   中英

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

[英]What is the correct way to import modules in python library?

当您编写一个python库并想要从另一个库中导入一个模块时,正确的方法是什么,以便从外部导入库以及从库目录运行某些单元测试时导入都可以工作?

如果你这样做

import some_module
from some_module import something

ImportError: No module named 'some_module'库运行时,它可以工作,但从外部ImportError: No module named 'some_module'时,会产生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运行unittests。 到目前为止,我通过添加使它起作用

import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

到单元测试文件的开头。 另外,也可以编写一个简短的Shell脚本,将父目录添加到PYTHONPATH ,然后运行unittests。 我想知道是否有更好的方法来应对?

看看有关模块搜索路径的文档

导入名为spam的模块时,解释器首先搜索具有该名称的内置模块。 如果找不到,它将在变量sys.path给出的目录列表中搜索名为spam.py的文件。 sys.path从以下位置初始化:

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

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

我建议从使用自动测试发现选项保存模块的基本目录中运行测试

python -m unittest discover (python >= 2.7)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM