gpt4 book ai didi

python - 隐藏 stdlib 包名称的子包中的绝对导入失败

转载 作者:太空狗 更新时间:2023-10-29 20:55:05 25 4
gpt4 key购买 nike

基本上我有一个与标准库包同名的子包(“日志记录”),我希望它能够绝对导入标准包,无论我如何运行它,但是当我'在父包中。

它真的看起来像是一个错误,或者是新的“绝对导入”支持(Python 2.5 的新功能)的未记录行为。尝试使用 2.5 和 2.6。

包布局:

foo/
__init__.py
logging/
__init__.py

foo/__init__.py 中我们导入了我们自己的日志子包:

from __future__ import absolute_import
from . import logging as rel_logging
print 'top, relative:', rel_logging

foo/logging/__init__.py 中,我们要导入标准库 logging 包:

from __future__ import absolute_import
print 'sub, name:', __name__

import logging as abs_logging
print 'sub, absolute:', abs_logging

注意:包含foo的文件夹在sys.path中。


当从 foo 外部/上方导入时,输出符合预期:

c:\> python -c "import foo"
sub, name: foo.logging
sub, absolute: <module 'logging' from 'c:\python26\lib\logging\__init__.pyc'>
top, relative: <module 'foo.logging' from 'foo\logging\__init__.pyc'>

所以子包中的绝对导入找到了想要的stdlib包。

但是当我们在 foo 文件夹中时,它的行为会有所不同:

c:\foo>\python25\python -c "import foo"
sub, name: foo.logging
sub, name: logging
sub, absolute: <module 'logging' from 'logging\__init__.pyc'>
sub, absolute: <module 'logging' from 'logging\__init__.pyc'>
top, relative: <module 'foo.logging' from 'c:\foo\logging\__init__.pyc'>

“sub, name”的双重输出显示我自己的名为“logging”的子包正在第二次导入自身,并且它没有找到标准库“logging”包即使“absolute_import”已启用.

用例是我希望能够使用、测试等这个包,而不管当前目录是什么。将名称从“logging”更改为其他名称将是一种解决方法,但不是理想的解决方法,而且在任何情况下,这种行为似乎都不符合绝对导入应该如何工作的描述。

知道发生了什么吗,这是一个错误(我的还是 Python 的),或者这种行为是否实际上是由某些文档暗示的?

编辑 gahooa 的回答清楚地表明了问题所在。这里显示了一个粗略的解决方法,证明它是这样的:

c:\foo>python -c "import sys; del sys.path[0]; import foo"
sub, name: foo.logging
sub, absolute: <module 'logging' from 'c:\python26\lib\logging\__init__.pyc'>
top, relative: <module 'foo.logging' from 'c:\foo\logging\__init__.pyc'>

最佳答案

sys.path[0] 默认为 '',表示“当前目录”。因此,如果您位于一个包含 logging 的目录中,则会首先选择该目录。

我最近遇到了这个问题,直到我意识到我实际上位于该目录中并且 sys.path 在查看标准库之前首先选择了我当前的目录。

关于python - 隐藏 stdlib 包名称的子包中的绝对导入失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1959188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com