如何导入标准库模块而不是本地目录?

2024-09-27 09:33:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为“calendar”的本地目录,其中有一个“\uuinit_uuy.py”文件。在

我希望“导入日历”导入标准库模块日历,而不是本地目录定义的模块。在

我已经尝试过“从未来导入绝对导入”和更改PYTHONPATH。在

有很好的理由我不能只是重命名目录。真正地。在


Tags: 模块文件py目录标准定义calendar重命名
3条回答

问题是,当您启动Python时,当前工作目录(作为''或{},取决于版本/平台)总是位于sys.path的顶部。在

使用绝对导入没有任何区别,这意味着首先查看sys.path,而不是在返回sys.path之前查找相对导入。在

正确的解决方案显然是(a)重命名calendar,或者(b)将其移动到其他包的子包中,而不是将其放在顶层。不管你的理由是什么,做正确事情的好理由可能会更好。在


但如果你必须避开这个问题,你可以做一些事情。最简单的方法是暂时默格sys.path

syspath = sys.path
sys.path = [path for path in sys.path if path.strip('.')]
import calendar
sys.path = syspath

然而,不管你做什么,这都会引起巨大的问题。当您稍后尝试导入本地包calendar-即使您是从完全不同的源文件导入的,也不会发生任何事情,因为sys.modules中已经存在名为calendar的内容,因此其他源文件将只获取stdlib calendar模块,而不是您的包。在

因此,您还需要动态地重命名其中一个,并将其从sys.modules中删除。可能是这样:

^{pr2}$

而且,根据模块运行的顺序(可能不容易预测,甚至不确定),很有可能在其他位置需要类似的黑客攻击。在

(如果您实际上不需要导入本地包calendar,该怎么办?好吧,那样的话,你就不会有这个问题了……但是我无法想象你有什么好理由……)

“将日历重命名为新的模块”选项称为“不使用”。在

但是作为一种解决方法,如果不可能,您可以在本地calendar.py文件所在的目录之外创建另一个模块(在syspath中可见)。在

所以,如果你有这样的层级结构:

project/
   __init__.py
   app1/
      __init__.py
      calendar.py
      module_in_which_i_want_to_use_python_std_calendar.py

您可以在apps(外部)外部创建一个名为std_calendar.py的新模块日历.py放置)。在此文件中,您可以导入日历(这将是标准日历模块)

^{pr2}$

层次结构是:

project/
   __init__.py
   std_calendar.py
   app1/
      __init__.py
      calendar.py
      module_in_which_i_want_to_use_python_std_calendar.py

module_in_which_i_want_to_use_python_std_calendar.py中,您可以将标准日历与:

from project import std_calendar as calendar

您可以修改^{},导入包,然后将sys.path还原为其原始值。在

import sys
original_path = sys.path
sys.path = original_path[1:]
import calendar
sys.path = original_path

相关问题 更多 >

    热门问题