Python 2.7 import语句如何在python中执行?

Python 2.7 import语句如何在python中执行?,python-2.7,Python 2.7,我在pydocs中读到了关于import语句的内容。它说它分两步执行。 (1) 找到一个模块,必要时进行初始化;(2) 在本地命名空间中定义一个或多个名称(import语句发生的范围)。第一个表单(不带from)对列表中的每个标识符重复这些步骤。具有from的表单执行步骤(1)一次,然后重复执行步骤(2) 我理解其中的一些内容,但我仍然不完全清楚。我主要对初始化步骤感到困惑,最后它说的是重复某个步骤。我唯一理解的是,如果我们使用say,例如: import sys 在这种情况下,如果我们在脚本

我在pydocs中读到了关于import语句的内容。它说它分两步执行。 (1) 找到一个模块,必要时进行初始化;(2) 在本地命名空间中定义一个或多个名称(import语句发生的范围)。第一个表单(不带from)对列表中的每个标识符重复这些步骤。具有from的表单执行步骤(1)一次,然后重复执行步骤(2)

我理解其中的一些内容,但我仍然不完全清楚。我主要对初始化步骤感到困惑,最后它说的是重复某个步骤。我唯一理解的是,如果我们使用say,例如:

import sys
在这种情况下,如果我们在脚本中使用这个模块的函数,我们需要使用sys.fun\u name()调用它们。因为没有使用此importstatement在本地提供这些函数。 但是当我们使用

from sys import argv
我们可以简单地使用argv函数,因为它使它可用于本地输出srcipt

请有人解释一下它的工作原理,并告诉我我的理解是否正确

甚至我试图将我的一个脚本导入到另一个脚本中,它给出了一些奇怪的结果,我知道这和import语句的第一步(初始化)有关

执行ex18.py时得到的输出如下

arg1: 'Gaurav', arg2: 'Pareek'
arg1: 'Gaurav', arg2: 'Pareek'
arg1: 'First!'
I got nothing.
I got nothing.
为什么是这样。它应该只打印一次我什么都没有。

它打印两次“我什么都没有。”因为函数
print\u none
被调用了两次。加载ex17模块时一次(因为它是在ex18中导入的),在ex18模块中调用时一次。如果您不希望执行ex17中的函数调用,而只希望加载函数def,那么您可以按如下方式编写它们

## in ex17.py

if __name__ == '__main__':
    print_two("Gaurav","Pareek")
    print_two_again("Gaurav","Pareek")
    print_one("First!")
    print_none()
现在,仅当此代码作为脚本运行(即,
$python ex17.py
时,才会执行此代码,但在将其导入其他模块时不会执行此代码。更多关于_umain的信息

关于这些文件的摘录,它只是简单地说明了两种导入形式的区别。步骤1负责查找和初始化模块,步骤2负责将名称添加到本地名称空间。所以在这个情况下,

import sys
from sys import argv, stdout
步骤1和2都将执行一次。但是如果是

import sys
from sys import argv, stdout

步骤1将只执行一次,但步骤2将执行两次,因为它需要将
argv
stdout
添加到本地名称空间。

main仅用于打印一次。但我认为对于import sys,两个步骤不会执行一次。我的理解是,当您说import sys时,然后,将对两个模块sys和os执行步骤1。然后对sys和os模块中所有可用的函数重复步骤2。但是从sys import argv,stdout将使步骤1仅执行一次,而对这两个函数仅argv和stdout重复步骤2。让我知道我是否正确。如果是导入sys,os,两个步骤都将执行两次(从文档中:“对列表中的每个标识符重复这些步骤”)。在这个特定的示例中,步骤2只将sys和os添加到本地名称空间,而不是全部代码。这就是为什么我们需要以
sys.argv
或.path.join
等方式访问代码(注意:
import sys,os
将被视为糟糕的样式),结果证明我的理解是错误的。现在已经很清楚了。但是关于上面的代码示例,还有最后一件事,当我试图使用从ex17导入打印\u none-way-of-import时,它给了我一个错误,说找不到模块。原因是什么?文件
ex17.py
相对于
ex18.py
的位置是什么?如果它们在同一个目录中,那么这就相当奇怪了。尝试打印
sys.path
。这是python将尝试查找模块的所有目录的列表。默认情况下,将当前工作目录添加到其中。