- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
基本上我有一个与标准库包同名的子包(“日志记录”),我希望它能够绝对导入标准包,无论我如何运行它,但是当我'在父包中。
它真的看起来像是一个错误,或者是新的“绝对导入”支持(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/
我在 Agda 中处理字符串,并且我有它们的向量。我需要检查给定字符串是否出现在向量中(作为检查变量是否自由或绑定(bind)在表达式中的一部分,在我正在做的 PL 理论 wprk 中)。 我仍在寻找
我正在编译大量使用 srand() 和 rand() 的文件,但不包括 stdlib.h。我知道这是不好的做法,但是由于我无法更改正在编译的文件,因此无法在每个文件中插入必要的 include 语句。
我想在我的 Rails 应用程序中使用 Date::ABBR_MONTHS 常量。我在 http://www.ruby-doc.org/stdlib/ 看到了 Ruby stdlib 文档似乎没有这个
昨天我更新了 Android Studio 版本和 Kotlin 插件版本。 Android Studio 版本:3.1.2 Kotlin 版本:1.2.41 当我使用此配置创建 Android 项目
我是使用 CGAL 库的初学者,在组合 CGAL 后,我尝试在 fedora 上运行一个组合映射示例 qt-creator: #include #include #include #includ
Android Studio 2.3.3; Kotlin 插件:1.1.4; Kotlin 编译器:Kotlin 到 JVM:1.6。 Android Studio > 新建项目 > 在项目操作中配置
我有使用 opengl 和 CGAL 的 c++ qt 项目,但我有以下错误: /usr/include/c++/7/cstdlib:75:15: fatal error: stdlib.h: No
我知道的一件事可能不是真的,那就是 T应该是可复制构造的,即T应该有一个可访问的复制构造函数。 但是,是否还有其他要求,例如copy assignable? 作为补充,我记得 Effective ST
此代码片段主要来自 qsort 的手册页。 int cmp(const void *p1, const void *p2) { char s1 = *(*(char * const *)p1);
在现代 C++ 中,标准库是否提供类型列表模板? int main() { using int_types = type_list; std::cout ::value ::type)
我一直在想,C++ 中的设计决策是否有任何理由不为任何标准库容器提供纯抽象类? 我很欣赏 hash_map 后来来自 stdext 命名空间,但共享一个非常相似的接口(interface)。如果我后来
这个问题在这里已经有了答案: What is the use of _start() in C? (4 个答案) 关闭 6 年前。 采用以下 C 程序: int main(){} 它没有使用 C 标
关注此blog post我试图编译 stdlib.so 以将其他代码与其链接。不幸的是,stdlib.so 本身是一个动态链接的二进制文件: # ldd /usr/local/go/pkg/linux
作为一个 puppet 新手,我有一个问题,包括 stdlib 插件 我想使用 stdlib 的 file_line,因此我尝试包含 stdlib 并调用它 class service_mon {
我正在尝试在我创建的类中使用 stdlib 堆栈,但我在动态创建它时遇到问题。 这是我的头文件“matcher.h”中的相关代码: private: stack opens;
我已经更新了我的一个非常旧的项目(XCODE 4.5.1 baseSDK iOS6)并且由于某种原因我得到了上面的错误。 它只为 iOS5+ 编译但不适用于 iOS 4.3 ? 有什么想法吗? 最佳答
我有一个使用标准库 fopen/fclose 函数实现的文件 IO 接口(interface),它运行良好,直到我们不得不将其更改为同步实现以防止数据丢失(一种情况)。所以我用系统调用(open()/
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How does system() exactly work in linux? 出于好奇,我想知道 sys
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 7 年前。 Improve
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我是一名优秀的程序员,十分优秀!