2024-09-27 09:33:14 发布
网友
我有一个名为“calendar”的本地目录,其中有一个“\uuinit_uuy.py”文件。在
我希望“导入日历”导入标准库模块日历,而不是本地目录定义的模块。在
我已经尝试过“从未来导入绝对导入”和更改PYTHONPATH。在
有很好的理由我不能只是重命名目录。真正地。在
问题是,当您启动Python时,当前工作目录(作为''或{},取决于版本/平台)总是位于sys.path的顶部。在
''
sys.path
使用绝对导入没有任何区别,这意味着首先查看sys.path,而不是在返回sys.path之前查找相对导入。在
正确的解决方案显然是(a)重命名calendar,或者(b)将其移动到其他包的子包中,而不是将其放在顶层。不管你的理由是什么,做正确事情的好理由可能会更好。在
calendar
但如果你必须避开这个问题,你可以做一些事情。最简单的方法是暂时默格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
因此,您还需要动态地重命名其中一个,并将其从sys.modules中删除。可能是这样:
而且,根据模块运行的顺序(可能不容易预测,甚至不确定),很有可能在其他位置需要类似的黑客攻击。在
(如果您实际上不需要导入本地包calendar,该怎么办?好吧,那样的话,你就不会有这个问题了……但是我无法想象你有什么好理由……)
“将日历重命名为新的模块”选项称为“不使用”。在
但是作为一种解决方法,如果不可能,您可以在本地calendar.py文件所在的目录之外创建另一个模块(在syspath中可见)。在
calendar.py
所以,如果你有这样的层级结构:
project/ __init__.py app1/ __init__.py calendar.py module_in_which_i_want_to_use_python_std_calendar.py
您可以在apps(外部)外部创建一个名为std_calendar.py的新模块日历.py放置)。在此文件中,您可以导入日历(这将是标准日历模块)
std_calendar.py
层次结构是:
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中,您可以将标准日历与:
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
问题是,当您启动Python时,当前工作目录(作为},取决于版本/平台)总是位于
''
或{sys.path
的顶部。在使用绝对导入没有任何区别,这意味着首先查看
sys.path
,而不是在返回sys.path
之前查找相对导入。在正确的解决方案显然是(a)重命名
calendar
,或者(b)将其移动到其他包的子包中,而不是将其放在顶层。不管你的理由是什么,做正确事情的好理由可能会更好。在但如果你必须避开这个问题,你可以做一些事情。最简单的方法是暂时默格
sys.path
:然而,不管你做什么,这都会引起巨大的问题。当您稍后尝试导入本地包
calendar
-即使您是从完全不同的源文件导入的,也不会发生任何事情,因为sys.modules
中已经存在名为calendar
的内容,因此其他源文件将只获取stdlibcalendar
模块,而不是您的包。在因此,您还需要动态地重命名其中一个,并将其从
^{pr2}$sys.modules
中删除。可能是这样:而且,根据模块运行的顺序(可能不容易预测,甚至不确定),很有可能在其他位置需要类似的黑客攻击。在
(如果您实际上不需要导入本地包
calendar
,该怎么办?好吧,那样的话,你就不会有这个问题了……但是我无法想象你有什么好理由……)“将日历重命名为新的模块”选项称为“不使用”。在
但是作为一种解决方法,如果不可能,您可以在本地
calendar.py
文件所在的目录之外创建另一个模块(在syspath中可见)。在所以,如果你有这样的层级结构:
您可以在apps(外部)外部创建一个名为
^{pr2}$std_calendar.py
的新模块日历.py放置)。在此文件中,您可以导入日历(这将是标准日历模块)层次结构是:
在
module_in_which_i_want_to_use_python_std_calendar.py
中,您可以将标准日历与:您可以修改^{} ,导入包,然后将
sys.path
还原为其原始值。在相关问题 更多 >
编程相关推荐