如何在Python模块中正确使用相对或绝对导入?

9 浏览
0 Comments

如何在Python模块中正确使用相对或绝对导入?

在Python中使用相对导入有一个缺点,就是不能再将模块作为独立的文件运行,否则会出现异常:ValueError: Attempted relative import in non-package\n要能够同时执行test.pyfoo.pybar.py,需要修改示例代码。\n我正在寻找一个适用于Python 2.6+(包括3.x)的解决方案。

0
0 Comments

在Python模块中如何正确使用相对或绝对导入?

在Python模块中,有时候我们需要引用其他模块中的函数、类等对象。在导入模块时,我们可以使用相对导入或绝对导入。那么相对导入和绝对导入的区别是什么?如何正确使用它们?

相对导入是相对于当前模块的位置来引用其他模块。相对导入使用的是点号(.)表示当前模块,双点号(..)表示上一级模块,以此类推。相对导入适用于同一个包中的模块之间的引用。

绝对导入是从顶层模块开始的绝对路径引用其他模块。绝对导入使用的是包名加模块名的形式,例如import package.module。绝对导入适用于不同包之间的模块引用。

那么为什么我们要考虑使用绝对导入而不是相对导入呢?原因在于,我们应该将包的命名空间视为全局的,而相对导入限制了包的命名空间只能在同一个包内使用。这就是为什么建议使用绝对导入的原因。

然而,使用绝对导入也存在一个问题,那就是在不同的环境中,模块的路径可能会发生变化。为了解决这个问题,我们可以通过编辑sys.path来适当地修改模块的搜索路径。下面是一些思考的参考代码:

# 上一级目录

_root_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))

sys.path.insert(0, _root_dir)

另外,也有人提出不要放弃使用相对导入,因为相对导入在绝对导入功能设计时就被认为是可以接受的,并且在今天仍然是可以接受的。所以,是否使用相对导入还是绝对导入,取决于具体的使用场景和个人偏好。

总结起来,相对导入和绝对导入都是在Python模块中引用其他模块的方式。相对导入适用于同一个包中的模块引用,而绝对导入适用于不同包之间的模块引用。在使用导入时,我们应该根据具体情况选择合适的方式,并注意维护模块的命名空间。如有需要,可以通过编辑sys.path来适当修改模块的搜索路径。

0
0 Comments

在Python模块中如何正确使用相对或绝对导入?

首先,我假设您意识到您编写的内容会导致循环导入的问题,因为foo导入bar,反之亦然;尝试在test.py中添加from foo import bar,您会发现它失败了。示例必须进行更改才能正常工作。

那么,您实际上是在询问当相对导入失败时如何回退到绝对导入;实际上,如果您将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

可能是最好的方法。这会将模块作为脚本运行。

我不认为except语句中的import bar适用于Python 3.1+,据我所知,没有理由导致except中的导入不起作用。在Python 3.2中它百分之百有效。

0
0 Comments

问题的原因是在使用Python模块中的相对或绝对导入时,可能会遇到一些困惑和错误。解决方法是使用正确的命令行语法来运行模块,或者在脚本中添加特定的代码行。

在命令行中,可以使用python -m命令来运行模块,例如python -mfoo.bar。这种方式可以确保正确地导入模块,并解决相对或绝对导入时可能出现的问题。但是,需要确保foo/__init__.py文件存在。

另一种解决方法是在脚本的第一行添加#!/usr/bin/python -mfoo.bar。这样可以在POSIX系统上直接执行脚本。然而,这种方法被认为是一种丑陋的hack,不被推荐使用,尤其是在Windows系统上执行脚本会更加困难。

,正确使用相对或绝对导入的方法是使用python -m命令来运行模块,或者在脚本中添加#!/usr/bin/python -mfoo.bar的代码行。这些方法可以确保模块的正确导入,并避免可能出现的问题。

0