python中各种导入语句之间的区别


问题内容
import sys
from sys import argv

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

在这里,我了解到,在第一种情况下,sys模块将作为第一步的一部分进行初始化,然后将其作为第二步提供给本地名称空间。但是,如果使用第二种输入形式,会怎样?将sys模块初始化为第一步,并且仅模块argv功能sys(NO
OTHER功能)可用于本地名称空间。因为sys在使用第二种形式的import语句时,我无法调用模块的任何其他功能。因此,只想具体说明一下即可。就像sys模块已经从import语句中初始化一样,我们应该能够使用调用其他函数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
statementsys模块没有被argv初始化,只有函数被初始化,但是在那种情况下,一旦意味着pydocs,步骤step(1)会执行什么?(注意:我正在使用python
2.7)


问题答案:

import语句 始终
初始化整个模块。模块存储在sys.modules字典中

使用模块时from sys import argvsys模块 不是
本地绑定的,只有本地绑定的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

在这里,我将名称绑定modulessys.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