我对以下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
,但是无论如何我都感到困惑。
os
模块实际导入sys
,因此sys
模块可通过os.sys
访问(就像模块顶级定义的任何名称一样)。这不会使sys
成为os
的适当子模块,因此您不能从os.sys
导入。
作为旁注,os
导入sys
是您不应依靠的实现细节。
您尚未导入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