如何在python中执行import语句?

时间:2014-03-25 06:46:46

标签: python-2.7

我在pydocs中读到了有关import语句的内容。它说它分两步执行。 (1)找到一个模块,并在必要时进行初始化; (2)在本地名称空间(发生import语句的作用域)中定义一个或多个名称。第一种形式(没有来自)为列表中的每个标识符重复这些步骤。带有from的表单执行步骤(1)一次,然后重复执行步骤(2)。

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

import sys

在这种情况下,如果我们在脚本中使用此模块的函数,我们需要使用sys.fun_name()调用它们。由于使用此importstatement无法在本地使用这些功能。 但是当我们使用

from sys import argv

我们可以简单地使用argv函数,因为它使它在本地可用于srcipt。

有人可以向我解释其工作情况,也让我知道我的理解是否正确。

即使我尝试将我的一个脚本导入另一个脚本,它也会产生一些奇怪的结果,我知道这与import语句的第一步有关,(初始化)

##### ex17.py #####
def print_two(*args):
arg1, arg2 = args
print "arg1: %r, arg2: %r" %(arg1, arg2)

def print_two_again(arg1, arg2):
print "arg1: %r, arg2: %r" %(arg1, arg2)

def print_one(arg1):
print "arg1: %r" %arg1

def print_none():
print "I got nothing."

print_two("Gaurav","Pareek")
print_two_again("Gaurav","Pareek")
print_one("First!")
print_none()

####### ex18.py ######
import ex17
ex17.print_none()

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

arg1: 'Gaurav', arg2: 'Pareek'
arg1: 'Gaurav', arg2: 'Pareek'
arg1: 'First!'
I got nothing.
I got nothing.

为什么会这样。它应该只打印我一无所获。

1 个答案:

答案 0 :(得分:0)

它打印"I got nothing."两次,因为函数print_none被调用两次。一旦加载ex17模块(因为它在ex18中导入)和一次在ex18模块中调用它。如果您不希望ex17中的函数调用执行但只需要加载函数defs,那么您可以按如下方式编写它们

## in ex17.py

if __name__ == '__main__':
    print_two("Gaurav","Pareek")
    print_two_again("Gaurav","Pareek")
    print_one("First!")
    print_none()

现在这个代码只有在作为脚本运行时才会被执行。 $ python ex17.py但不是在将其导入其他模块时。有关__main__ here

的更多信息

关于文档的摘录,它简单地说明了两种导入形式的不同之处。步骤1负责查找和初始化模块,步骤2负责将名称添加到本地名称空间。所以,如果是,

import sys

步骤1和2都将执行一次。但是,如果,

from sys import argv, stdout

第1步将只执行一次,但第2步将执行两次,因为它需要将argvstdout添加到本地命名空间。