如何在Python中访问标准库模块而不受同名本地模块影响?

17 投票
2 回答
7141 浏览
提问于 2025-04-15 16:59

当一个名为 prog.py 的文件和一个本地模块(比如 math.py)放在同一个文件夹里时,如何访问标准库中的模块(比如 math)呢?

我问这个问题是因为我想创建一个叫做 uncertainties 的包,用户可以这样使用:

import uncertainties
from uncertainties.math import *

因此,在 uncertainties 这个文件夹里有一个本地的 math 模块。问题是我想在 uncertainties/__init__.py 文件中访问标准库的 math 模块。

我不想重命名 uncertainties.math,因为这个模块正是为了替代 math 模块中的一些函数(用来处理数值不确定性的等效函数)。

附言:这个问题与我写的一个模块有关,目的是进行 带有不确定性的计算,同时考虑变量之间的相关性。

2 个回答

4

为什么你不能再给本地模块改名字呢?

很明显,这并不是一个“完全”的替代品,因为你还需要从已经安装的 uncertainties 中获取一些东西。

既然它只是部分替代,你就不应该给它起一样的名字。

有什么不同?有什么相同?根据这些来选择一个更合适的名字。

22

你在寻找绝对导入和相对导入的相关信息,可以参考PEP 328,这个特性在Python 2.5 及更高版本中可用。

在Python 2.5中,你可以通过在代码里加上 from __future__ import absolute_import 这行来改变导入的行为,让它使用绝对导入。将来某个版本(可能是Python 2.7)会把绝对导入设为默认选项。一旦绝对导入成为默认,像 import math 这样的写法就总是能找到标准库里的版本。建议大家尽量使用绝对导入,所以在写代码时最好用 from pkg import string 这种方式。

如果你想用相对导入,还是可以做到的,只需在模块名之前加一个点,比如在使用 from ... import 的时候:

from __future__ import absolute_import
# Import uncertainties.math
from . import math as local_math
import math as sys_math

撰写回答