为什么我得到这个ImportError,虽然python说模块存在?

时间:2017-03-02 15:31:16

标签: python python-3.x ipython

我对以下的repl互动感到困惑:

In [7]: import os

In [8]: os.sys
Out[8]: <module 'sys' (built-in)>

In [9]: os.sys.stderr
Out[9]: <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>

In [10]: from os.sys import stderr
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-10-cd47f2925e40> in <module>()
----> 1 from os.sys import stderr

ImportError: No module named 'os.sys'; 'os' is not a package

如何将python 3.5.3声明os.sys是一个模块,但在尝试导入它时会引发错误?

P.S。:我知道,为了访问错误流,我需要import stderr from sys,但无论如何我都很困惑。

2 个答案:

答案 0 :(得分:2)

os模块实际导入sys,因此sys模块可以通过os.sys访问(就像在模块顶层定义的任何名称一样)。这不会使sys成为os的正确子模块,因此您无法从os.sys导入。

作为旁注,os导入sys的事实是您不应该依赖的实现细节。

答案 1 :(得分:1)

您尚未导入os.sys。您只访问过该符号。 from ... import ...语句试图访问没有数据的解释器的一部分。 (最有可能的是,sys.modules。)

在重复命令之前尝试执行import os.sys

>>> import sys
>>> sys.modules['os']
>>> <module 'os' from '/.../lib/python3.5/os.py'>
sys.modules['os.sys']
>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'os.sys'

此外,os.sys似乎是sys模块的别名。没有有效的导入,

>>> import sys
>>> os.sys == sys
>>> True