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

9

我在一个目录中有几个 Python 模块。

在同一目录中,我有一个名为tests的包。

我希望将 tests 中的模块命名与它们所包含的模块相同,尽管这并不是必要的。

所以,在 tests.foo 中,我天真地写了 import foo。但这并不起作用 - 它导入的是 tests.foo,而不是顶层的 foo

我能否实现我想要的,还是我只能将测试模块称为 test_foo

如果这很明显或者重复了,请见谅,我的搜索技巧失败了。

2个回答

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

3

谢谢,但是出现了“ValueError: Attempted relative import beyond toplevel package”错误。这是Python 2.6版本,如果有区别的话。你可能是对的,我应该一开始就把所有东西放在顶级包中。我不确定现在进行这种更改是否会很容易。 - Steve Jessop
@Steve Jessop:抱歉,我的意思是使用完整的包路径导入“foo”模块,我已经编辑过了,希望现在清楚了。 - mouad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接