【发布时间】:2013-02-28 00:27:17
【问题描述】:
我有一个名为tokenize.py 的本地模块,它屏蔽了一个同名的标准库模块。我只是在尝试导入外部模块 (sklearn.linear_model) 时才发现这一点,而外部模块又会执行 import tokenize 并希望获取标准库模块,但会获取我的本地模块。
这个和How to access a standard-library module in Python when there is a local module with the same name?有关,但是设置不同,因为应用上述方案需要修改外部模块。
一个选项是重命名本地 tokenize.py,但我不希望这样做,因为“tokenize”最能表达模块的作用。
为了说明问题,这里是模块结构的草图:
\我的模块 \__init__.py \tokenize.py \use_tokenize.py在use_tokenize.py中,有如下导入:
import sklearn.linear_model
调用python my_module/use_tokenize.py时出现如下错误:
Traceback (most recent call last):
File "use_tokenize.py", line 1, in <module>
import sklearn.linear_model
<...>
File "<EDITED>/lib/python2.7/site-packages/sklearn/externals/joblib/format_stack.py", line 35, in <module>
generate_tokens = tokenize.tokenize
AttributeError: 'module' object has no attribute 'tokenize'
在导入外部模块时有什么方法可以抑制本地模块?
编辑:添加 python2.7 作为标签,因为 cmets 解决方案因 Python 版本而异
【问题讨论】:
-
您使用的是哪个版本的 Python?规则和解决方法不同。
-
但实际上,您应该重命名本地
tokenize.py。自动修复所有数百个脚本和模块中的所有import tokenize和tokenize.的脚本应该需要几分钟的编写和几秒钟的运行...... -
如果你创建一个与标准库模块同名的模块,没有人可以在不屏蔽标准库模块的情况下安装你的库。解决方案是不要给你的模块起这个名字。 (如果它是包的一部分,您仍然可以拥有
tokenize.py,因为在这种情况下,简单的import tokenize将看不到它。) -
我很欣赏重命名模块是一种解决方案,但实际上并不能回答问题。鉴于标准库相当大,命名空间冲突并不令人惊讶,而相对导入机制解决了这个问题。但是,如何处理不使用相对导入的第三方代码?
-
我也会把我的帽子扔进“重命名标记化”堆。这可能不会导致巨大的错误,但与标准库的命名空间冲突很容易避免。
标签: python python-2.7