【问题标题】:Why don't I need to import sys?为什么我不需要导入 sys?
【发布时间】:2016-12-23 06:24:15
【问题描述】:

我有 2 个 python 脚本,都使用 sys.stdout、sys.exit() 等。在一个脚本中,PyCharm 将“import sys”突出显示为灰色(意味着它从未使用过),如果我删除导入声明,程序运行良好,包括 sys.stdout 和 sys.exit()。

但是,第二个模块没有将“import sys”突出显示为灰色,如果我尝试在没有该语句的情况下运行它,我会在第一次出现 sys.stdout 时收到错误:

    NameError: name 'sys' is not defined

我查阅了 sys 的官方文档,上面写着 "此模块提供对解释器使用或维护的一些变量以及与解释器强交互的函数的访问。它始终可用。"

然而,大多数关于如何使用 sys 的指南或说明都会告诉您导入。

那么,我是否必须导入它? 为什么一个程序需要,而另一个程序不需要?

这两个程序之间可能存在的重要区别:

一个程序有一个主函数,并导入另一个程序。这是不需要导入 sys. 当它作为模块导入另一个时,也许它固有地导入 sys?

【问题讨论】:

  • 你会的。我认为It is always available 只是意味着你不能在不安装 sys 模块的情况下安装 python。
  • 我想我明白了,“来自____ import *”很奇怪。似乎这会导致它导入目标库导入的任何内容。
  • 始终可以导入。这并不意味着它是隐式导入的。您仍然需要明确的 import 语句才能使该模块在当前命名空间中可访问。 Explicit is better than implicit.
  • @EliezerMiron 是的,“star”导入会使用导入模块中定义的任何名称来破坏您的命名空间,这是在普通脚本中最好避免使用它们的原因之一(尽管它们在包中很有用__init__.py 文件,您可以通过使用 __all__ 来限制它们的影响。FWIW,在标准 Python(又名 CPython)中,sys 模块实际上被编译到解释器中,它不会从单独的文件中加载. 但是您仍然需要显式导入它以将sys 名称放入您的命名空间中。

标签: python-3.x import python-import sys


【解决方案1】:

似乎第一个脚本没有只是导入第二个脚本;它从中导入 *,如下所示: 在 module_1 中:

    from module_2 import *

在module_2中:

    import sys

这会导致 module_1 间接导入 sys。如果我改变了

    from module_2 import *

    import module_2

那么它就不再起作用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    相关资源
    最近更新 更多