导入操作

导入操作使用 import 语句,详细的语法规则查看 import 导入语句

  • import ... 只能导入模块:
import random as r, pandas.core as pc
r, pc
(<module 'random' from 'F:\\anaconda\\lib\\random.py'>,
 <module 'pandas.core' from 'F:\\anaconda\\lib\\site-packages\\pandas\\core\\__init__.py'>)
# 导入方法报错
import random.randint
---------------------------------------------------------------------------

ModuleNotFoundError                       Traceback (most recent call last)

<ipython-input-2-8d4ecd1fe339> in <module>
      1 # 导入方法报错
----> 2 import random.randint


ModuleNotFoundError: No module named 'random.randint'; 'random' is not a package
  • from ... import ... 从模块中导入子模块,类,函数等:
from pandas import core
core
<module 'pandas.core' from 'F:\\anaconda\\lib\\site-packages\\pandas\\core\\__init__.py'>
from pandas import DataFrame as df
df
pandas.core.frame.DataFrame
from random import randint
randint
<bound method Random.randint of <random.Random object at 0x000001E44ED52020>>
from math import pi
pi
3.141592653589793
  • from ... import * 将导入模块中所有的公有属性:

当前文件路径下,有一个 myfile 的包,包里有 space.pymycode.py__init__.py 等模块,__init__.py 内容为空,则 myfile 包里的模块都不是它的属性,无法导入

import myfile
dir(myfile)
['__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__path__',
 '__spec__']
from myfile import *
mycode
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

~\AppData\Local\Temp/ipykernel_21108/1508979804.py in <module>
      1 from myfile import *
----> 2 mycode


NameError: name 'mycode' is not defined

如果在文件 __init__.py 中我们定义了属性 __all__ ,从包 myfile 导入则只能导入该属性中的列出名称。

# 修改 myfile/__init__.py
__all__ = ['mycode','xue']
from myfile import *
mycode
我是mycode模块中的代码


<module 'myfile.mycode' from 'D:\\Jupyter\\jupyter\\jupyter-python\\15_module\\myfile\\mycode.py'>

在文件 myfile/mycode.py 中,以下划线打头的属性名,从模块 mycode.mycode 导入时都不可导入。

# myfile/mycode.py
_a = '自学'

def __f():
    print(_a)

msg1 = '我是mycode模块中的代码'
print(msg1)

if __name__ == '__main__':
    msg2 = '我是导入其他模块不会执行的代码'
    print(msg2)
from myfile.mycode import *
_a
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

~\AppData\Local\Temp/ipykernel_9512/1217097939.py in <module>
      1 from myfile.mycode import *
----> 2 _a


NameError: name '_a' is not defined
__f
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

~\AppData\Local\Temp/ipykernel_9512/3733874203.py in <module>
----> 1 __f


NameError: name '__f' is not defined

通常情况下不应使用这个功能,因为它在解释器中引入了一组未知的名称,而它们很可能会覆盖一些你已经定义过的名称。而且会导致代码的可读性很差。

# 其他方式则可以导入
from myfile.mycode import __f
print(__f)
del __f
<function __f at 0x00000157E4BA53A0>
  • 相对导入:

存在相对导入代码的模块,通常是不能直接执行的。因为直接执行,解释器认为该模块即为顶级模块,属性 __package__ 的值为 None。

print(__package__)
None

但可以使用 python -m 模块 命令直接执行。

例如,当前文件路径下,文件 myfile/test.py 中相对导入的代码可以使用 python -m 模块 命令直接执行,因为该命令将属性 __package__ 重新设置为顶级模块的名称:

# xue.py 模块在 myfile 包中,内容是 “msg = '自学是门手艺'”
# myfile/test.py 的内容
from . import xue
print(xue.msg)
print(__package__)
%run -m myfile.test
自学是门手艺
myfile

模块导入之后,即可使用属性表示法调用模块中属性:

import random, math
random.randint, math.pi
(<bound method Random.randint of <random.Random object at 0x000002811CF98C80>>,
 3.141592653589793)