真正进口的是什么?

时间:2019-05-17 11:20:09

标签: python import module

import在Python(3.5)中的工作方式使我有些困惑。我认为使用“ import x”之类的东西就像将任何内容写入“ x.py”一样,但是看起来并不像。

我具有以下结构:

  • main.py
  • 包装1
    • module1.py

现在,为了完成,模块是:

## module1.py
import numpy as np
import matplotlib.pyplot as plt

def plot(x,y):
    A = plt.figure()
    plt.plot(x,y)
    plt.show()
    return A

因此,它确实没有matplotlib.pyplot做不到的任何事情。现在我的main.py只是这样称呼它:

## main.py
from Package1.module1 import plot
a= plot([1,2,3],[2,4,6])

这有效。因此,我假设它实际上将matplotlib.pyplot导入为plt,因为否则功能plot将无法正常工作。但是,如果现在我向main.py添加任何内容,例如plt.figure()np.array(),它表示无法识别这些内容。

所以实际的问题是...我是否已将matplotlib.pyplot导入到主要名称空间?如果没有,这里是否有其他名称空间?如果有的话,如果我现在想在该代码下面的matplotlib中使用main.py,并用import matplotlib.pyplot as plt再次导入,我会两次导入吗?

我在这里的层次结构中有些迷路了。

1 个答案:

答案 0 :(得分:2)

from Package1.module1 import plot

执行此操作时,仅模块plot中的名称Package1.module1被拉入当前模块(main.py)中。 Package1.module1中可能定义的其他符号未插入。

但是。

Pacakge1.module1中的整个模块都已运行。如果将print('something')放在模块的全局部分中,例如:

## module1.py
import numpy as np
import matplotlib.pyplot as plt

print('something')

def plot(x,y):
    A = plt.figure()
    plt.plot(x,y)
    plt.show()
    return A

它将被打印。

something

因此,您的函数定义确实已加载到运行时中。因此,您的功能有效。但是您只能访问导入的功能,即plot,而不能访问其他任何功能。