提问人:user2153235 提问时间:6/29/2023 最后编辑:user2153235 更新时间:6/29/2023 访问量:218
Python:导入“sys”模块是否也导入“os”模块?
Python: Does importing "sys" module also import "os" module?
问:
我正在按照本教程了解为什么 Python 无法识别在 Conda 提示符下设置的环境变量(使用 CMD 语法,因为这是 Windows 10 上的 Anaconda 安装)。
它需要这个模块,作为我熟悉 Python 的一部分,我决定测试是否已经导入。测试模块是否存在需要该模块(如此处所述)。os
os
sys
奇怪的是,在导入后,我发现它无需我这样做即可导入。我觉得这很奇怪,因为我的大部分谷歌搜索都表明您必须单独导入它们,例如,这里。sys
os
导入 sys
是否也像看起来那样赋予 os
?如果是这样,为什么通常单独导入两者?
我无法在导入之前测试是否存在,因为我需要测试模块的存在。os
sys
sys
这是显示明显存在的代码 from import ,格式化为可读性。它从 Windows 中的 Conda 提示符开始。Conda 环境是“py39”,适用于 Python 3.9:os
sys
(py39) C:\Users\User.Name > python
Python 3.9.16 (main, Mar 8 2023, 10:39:24)
[MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license"
for more information.
>>> import sys
>>> "os" in sys.modules
True
后记:多亏了 Zero 的回答,我发现这段代码更符合我想要的。加载后,适当的测试是:sys
( 'os' in sys.modules ) and ( 'os' in dir() )
(py39) C:\Users\User.Name > python
'os' in dir() # False
import sys
'os' in sys.modules , 'os' in dir() # (True, False)
( 'os' in sys.modules ) and ( 'os' in dir() ) # False
import os
'os' in sys.modules , 'os' in dir() # (True, True)
( 'os' in sys.modules ) and ( 'os' in dir() ) # True
sys.modules
显示模块是否已导入到任何位置(大概是在 Python 解释器执行的代码中),同时指示模块名称是否在当前命名空间中。感谢 Carcigenicate 澄清了这一点,我希望我理解正确。dir()
答:
sys
使用该模块,但不将其导入到代码中。您可以通过代码进行确认。os
In [1]: import sys
In [2]: os.getcwd()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In [2], line 1
----> 1 os.getcwd()
NameError: name 'os' is not defined
评论
不,不导入 .但是,os
确实会导入 sys
。sys
os
>>> import os
>>> os.sys
<module 'sys' (built-in)>
实际的模块对象可能会在典型安装中被冻结,即 FrozenImporter
将从自动生成的 C 版本中找到它,而不是从文件中找到它。该模块可能会由 BuiltinImporter
加载,并且实际上被编译到解释器中(以及其他一些,目前不包括 )。os
os.py
sys
os
请注意,它们都是在解释器启动期间导入的,正如您通过执行以下命令所看到的:
python3 -v -c ''
当您导入和/或从交互式解释器导入和/或从交互式解释器导入时,您所要做的就是将名称绑定到本地命名空间中 - 两个模块都已完全加载,不会再次导入。sys
os
评论
os
sys
os.*
python3
python -v -c
script
sys
os
os
评论