我对以下的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
,但无论如何我都很困惑。
答案 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