“os”模块是否不受导入阴影的影响?

时间:2015-01-18 01:07:49

标签: python

在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”不影响系统?

(我在输入问题时想出了这个问题,但无论如何我都会发帖以防万一其他人想知道。)

1 个答案:

答案 0 :(得分:1)

在启动时,inter os已经被interpeter加载,在脚本/模块的全局变量中不可用。就像模块已经在包中的某个地方导入一样,但在将其导入之前不可用于其他子模块。

实际上有很多像这样的模块;试试python -c "import sys; print('\n'.join(sorted(sys.modules)))"