Python:导入“sys”模块是否也导入“os”模块?

Python: Does importing "sys" module also import "os" module?

提问人:user2153235 提问时间:6/29/2023 最后编辑:user2153235 更新时间:6/29/2023 访问量:218

问:

我正在按照本教程了解为什么 Python 无法识别在 Conda 提示符下设置的环境变量(使用 CMD 语法,因为这是 Windows 10 上的 Anaconda 安装)。

它需要这个模块,作为我熟悉 Python 的一部分,我决定测试是否已经导入。测试模块是否存在需要该模块(如此所述)。osossys

奇怪的是,在导入后,我发现它无需我这样做即可导入。我觉得这很奇怪,因为我的大部分谷歌搜索都表明您必须单独导入它们,例如,这里sysos

导入 sys 是否也像看起来那样赋予 os?如果是这样,为什么通常单独导入两者?

我无法在导入之前测试是否存在,因为我需要测试模块的存在。ossyssys

这是显示明显存在的代码 from import ,格式化为可读性。它从 Windows 中的 Conda 提示符开始。Conda 环境是“py39”,适用于 Python 3.9:ossys

(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()

python 模块

评论

1赞 juanpa.arrivillaga 6/29/2023
许多模块都是预加载的,但这并不意味着它们在你正在使用的命名空间中可用。
0赞 user2153235 6/29/2023
我只是在这里发现这一点

答:

-1赞 Zero 6/29/2023 #1

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

评论

0赞 user2153235 6/29/2023
埃加德!看起来我在问题中引用的用于测试模块存在的页面大多不可靠。该页面上的一个特定答案更可靠,并与您的答案相印证。
0赞 Carcigenicate 6/29/2023
@user2153235 这真的取决于你到底想测试什么。第一个演示如何检查模块是否已从任何地方导入,而原始问题是针对代码中的任何位置,而不是特定模块中。
0赞 user2153235 6/29/2023
我刚刚开始了解 Python。我不知道模块的导入是特定于某些范围的。到目前为止,我主要在探索使用 REPL 命令行。我不得不承认,我不太明白你对“从任何地方”与“从代码中的任何位置”的引用之间的区别。
0赞 Carcigenicate 6/29/2023
@user2153235没有区别,这是我的观点。您链接到的第一个问题并非不可靠,如果您只想检查当前模块,那么它就不是适合您情况的正确问题。
0赞 user2153235 6/29/2023
特定于作用域的模块导入也是如此(就像非全局变量一样)。这是否意味着如果模块“x”导入模块“y”,那么“y”仅对“x”中的代码可见?
2赞 wim 6/29/2023 #2

不,不导入 .但是,os 确实会导入 syssysos

>>> import os
>>> os.sys
<module 'sys' (built-in)>

实际的模块对象可能会在典型安装中被冻结,即 FrozenImporter 将从自动生成的 C 版本中找到它,而不是从文件中找到它。该模块可能会由 BuiltinImporter 加载,并且实际上被编译到解释器中(以及其他一些,目前不包括 )。osos.pysysos

请注意,它们都是在解释器启动期间导入的,正如您通过执行以下命令所看到的:

python3 -v -c ''

当您导入和/或从交互式解释器导入和/或从交互式解释器导入时,您所要做的就是将名称绑定到本地命名空间中 - 两个模块都已完全加载,不会再次导入。sysos

评论

0赞 user2153235 6/29/2023
是的,我注意到我的一个引文加载了。它位于命名空间中。对我来说,没有被识别,但由于我的 Conda 环境是针对 Python 3.9 的,我刚刚发布了 .大量输出!我使用 Cygwin 的命令运行启动 Conda 提示符的 CMD 命令,从而捕获终端会话以供 Vim 仔细阅读。单词 和 出现在许多上下文中,但我只看到看起来像 .感谢您澄清在这种情况下导入的作用。ossysos.*python3python -v -cscriptsysosos
0赞 user2153235 6/29/2023
作为 Python 的新手,我没有完全理解你关于冻结模块的段落,但你回答的其余部分非常有帮助(即使是我不遵循的部分也可能对其他人有帮助)。