如何导入与我包中的模块名称冲突的模块?

9 投票
2 回答
5381 浏览
提问于 2025-04-16 10:43

我在一个文件夹里有几个Python模块。

在同一个文件夹里,我还有一个叫做tests的包。

我希望tests里的模块名字能和它们测试的模块相同,虽然这并不是特别重要。

所以,在tests.foo里,我简单地写了import foo。但这并没有按我想的那样工作——它导入的是tests.foo,而不是最上层的foo

我能实现我想要的效果吗,还是说我只能把测试模块叫做test_foo

抱歉如果这个问题很明显或者是重复的,我的搜索能力不太行。

2 个回答

3

使用完整的包路径,像这样:

--Package
   |-- __init__.py
   |-- foo.py
   |
   |-- tests
   |    | -- __init__.py
        | -- foo.py

tests/foo.py 中这样做:

from Package import foo

我觉得这部分文档可能会引起你的兴趣: http://docs.python.org/whatsnew/2.5.html#pep-328-absolute-and-relative-imports

8

test_foo.py 在这种情况下看起来是个合适的解决方案。

如果你不打算重命名测试模块,那么可以把 tests 目录变成一个 Python 包(也就是在里面添加一个 tests/__init__.py 文件),然后使用 绝对导入

from __future__ import absolute_import 
import foo                   # import global foo.py, the first foo.py in sys.path
import tests.foo as test_foo # import tests/foo.py

撰写回答