在Python中使用相对导入有一个缺点,您将无法再独立运行模块,因为您将获得异常:ValueError: Attempted relative import in non-package

# /test.py: just a sample file importing foo module
import foo
...

# /foo/foo.py:
from . import bar
...
if __name__ == "__main__":
   pass

# /foo/bar.py: a submodule of foo, used by foo.py
from . import foo
...
if __name__ == "__main__":
   pass

我应该如何修改示例代码才能执行所有代码:test.pyfoo.pybar.py
我正在寻找适用于python 2.6+(包括3.x)的解决方案。

最佳答案

首先,我假设您意识到您编写的内容将导致循环导入问题,因为foo导入bar反之亦然;尝试添加

from foo import bar

to test.py,您将看到它失败。必须更改示例才能正常工作。

因此,您要问的是,当相对导入失败时,回退到绝对导入。实际上,如果您要执行foo.py或bar.py作为主模块,则其他模块将仅位于根级别,并且它们是否与系统上要选择的其他模块共享名称取决于该模块。 sys.path中的顺序。由于当前目录通常是第一个,因此将选择本地模块(如果有)-即,如果当前工作目录中有一个“os.py”文件,则将选择它而不是内置目录。

一个可能的建议是:

foo.py
try:
    from . import bar
except ValueError:
    import bar

if __name__ == "__main__":
    pass

bar.py:
if __name__ == "__main__":
    pass

顺便说一下,从适当的位置调用脚本通常会更好。
python -m foo.bar

可能是最好的方法。这runs the module as a script

关于python - 如何在Python模块中正确使用相对或绝对导入?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3616952/

10-10 17:22
查看更多