导入操作
导入操作使用 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.py
,mycode.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)