在Python中,人们试图避免模块名称与标准库冲突,尽管Python 3通过去除包中的隐式相对导入来使其更好。所以我故意这样做,以测试我的理解,并得到一个惊喜。
test/
__init__.py
test.py:
import os
import string
os.py:
print("os")
string.py:
print("string")
从父目录运行:
$ python2 -m test.test
os
string
隐含的相对导入会影响系统模块,如预期的那样。
$ python3 -m test.test
Python 3中的绝对导入,正如预期的那样。
$ python test/test.py
string
$ python3 test/test.py
string
咦?为什么脚本目录中的“os”不影响系统?
(我在输入问题时想出了这个问题,但无论如何我都会发帖以防万一其他人想知道。)
答案 0 :(得分:1)
在启动时,inter os
已经被interpeter加载,在脚本/模块的全局变量中不可用。就像模块已经在包中的某个地方导入一样,但在将其导入之前不可用于其他子模块。
实际上有很多像这样的模块;试试python -c "import sys; print('\n'.join(sorted(sys.modules)))"
。