【问题标题】:difference between various import statements in pythonpython中各种import语句的区别
【发布时间】:2014-05-05 11:31:36
【问题描述】:
import sys
from sys import argv

我阅读了有关 pydocs 中的 import 语句的信息。它说它分两步执行。 (1)找到一个模块,必要时初始化它; (2) 在本地命名空间中定义一个或多个名称(在 import 语句出现的范围内)。第一种形式(没有 from)对list 中的每个标识符重复这些步骤。带有from的表单执行一次步骤(1),然后重复执行步骤(2)。

在这里我了解到,在第一种情况下,sys 模块将作为第一步的一部分进行初始化,然后作为第二步将其提供给本地命名空间。 但是如果是第二个进口表格会发生什么? 将sys 模块作为第一步初始化,并且只有sys 模块的argv 函数(没有其他函数)可用于本地命名空间。 因为当我使用第二种形式的 import 语句时,我无法调用 sys 模块的任何其他函数。所以只是想具体澄清一下。好像sys 模块已经从导入语句中初始化,那么我们应该能够使用sys 调用其他函数。但这不起作用。

#import sys
from sys import argv

script, input = argv

print "This was the input entered by command line", input

print sys.path # this is not working giving error name sys is not defined.

我怀疑在 from import 语句 sys 模块未初始化的情况下,只有 argv 函数正在初始化,但在这种情况下,from step 执行 step(1) 一次意味着 pydocs 吗?(注意:我我正在研究 python 2.7)

【问题讨论】:

  • @MartijnPieters:您提到导入模块不会浪费任何东西;该模块始终是完全导入的(进入 sys.modules 映射),因此无论您使用 import sys 还是 from sys import argv 都没有任何问题。并且模块的其余部分也将在那里,然后为什么我无法使用 sys.path。这是我的问题

标签: python python-2.7 import


【解决方案1】:

import 语句always 初始化整个模块。模块存储在sys.modules dictionary

当您使用from sys import argv 时,sys 模块没有在本地绑定,只有argv 是。您不能在模块中使用名称 sys,因为您没有导入该名称。

如果单独导入sys,则只能访问sys模块:

from sys import argv

script, input = argv

import sys
print sys.path

而且您始终可以通过访问sys.modules 来访问所有导入的模块:

from sys import modules

print modules['sys'].path

在这里,我将名称 modules 绑定到 sys.modules 字典,并通过该引用找到 sys 模块,并引用 path 属性。

演示:

>>> from sys import modules
>>> modules['sys']
<module 'sys' (built-in)>
>>> sys
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined

【讨论】:

  • 好的,现在知道了。您之前共享的链接被提及。 sys 模块的其余部分仍然存在,无论您是否使用该模块中的任何其他内容。所以这条线实际上让我感到困惑。所以现在我很清楚,即使整个模块都可用,直到它没有绑定到命名空间,它也不会工作。我们需要再次导入 sys
猜你喜欢
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 2015-09-03
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
相关资源
最近更新 更多