admin 管理员组

文章数量: 887032


2024年1月5日发(作者:dscq2000)

1 python包模块import和from及__all__

python指定导入目录路径,称为包导入。

通过import和from导入包模块。

通过__all__指定导入的模块和导入的模块属性。

1.1 python包import和from

用法

import

from 2 import mod

from import x

描述

NO 内容

1

2

3

4

5

6

7

8

9

示例

# dir1__init__.py

print('在dir1__init__.py')

a = 1

# dir1dir2__init__.py

print('在dir1dir2__init__.py')

b = 2

#

print('在')

s = '梯阅线条'

# 在 idle 执行下面示例

>>> import os

>>> path=r'E:documentsF盘'

描述

包导入的路径以点号分隔,点号对应机器路径分隔符。

包名对应机器目录,左边为父目录,右边为子目录。

dir1所在父目录必须在模块搜索路径中。

包导入的路径(目录)必须存在__init__.py,才能导入成功。__init__.py内容可以为空和非空。

首次导入包时,自动执行__init__.py文件内容。

import 返回模块对象,包含__init__.py的全部变量。

import 后,每次使用都需要写全路径:.x,如果路径有变更,每处使用的地方都要修改。

from 2 import mod,使用不需写全路径:mod.x,如果路径有变更,只需修改from一处。

通过as给import包取别名,简化书写。

点号分隔

目录关系

搜索路径

__init__.py

包初始化

模块初始

import

from

as

>>> (path)

# 首次导入自动执行__init__.py

>>> import

在dir1__init__.py

在dir1dir2__init__.py

>>> .s

'梯阅线条'

# 再次导入不再执行__init__.py

>>> import

# 修改py文件

# dir1__init__.py

print('修改在dir1__init__.py')

a = 1

# dir1dir2__init__.py

print('修改在dir1dir2__init__.py')

b = 2

#

print('修改在')

s = '修改梯阅线条'

# 在 idle 执行下面示例

# 直接import不会执行修改后代码

>>> import

>>> .s

'梯阅线条'

# reload 模块或包重新执行对应__init__.py最新代码

>>> reload()

修改在

>>> .s

'修改梯阅线条'

>>> reload(2)

修改在dir1dir2__init__.py

>>> reload(dir1)

修改在dir1__init__.py

# 模块对象 包含__init__.py 全部顶层变量

>>> dir1.a

1

>>> 2.b

2

# import 需要写全路径,否则找不到模块对象

>>> .s

Traceback (most recent call last):

File "", line 1, in

.s

NameError: name 'dir2' is not defined

# from 不需写全路径,只需写import后面变量即可

>>> from 2 import mod

>>> mod.s

'修改梯阅线条'

# as 给包路径取别名,通过别名访问模块对象属性

>>> import as md

>>> md.s

'修改梯阅线条'

1.2 python模块__all__列表

用法

#

__all__ =['v1','myprint',]

描述

python用from module import *导入模块属性时:

NO 描述

1

2

3

示例

# E:documentsF盘

import sys

__all__ =['v1','myprint',]

print('模块__all__')

v1 = '梯阅线条'

v2 = ''

def myprint():

print(v2)

def myecho():

print(v1)

模块已定义__all__列表,则只导入__all__列表内的属性、方法、类

模块未定义__all__列表,则导入模块的全部顶层属性

__all__写在import语句下面

# 在 idle 执行下面示例

>>> import os

>>> path=r'E:documentsF盘'

>>> (path)

>>> from moda import *

模块__all__

# 可以访问 __all__ 列表属性

>>> v1

'梯阅线条'

# 不可访问 __all__ 列表外属性

>>> v2

Traceback (most recent call last):

File "", line 1, in

v2

NameError: name 'v2' is not defined

>>> myprint()

>>> myecho()

Traceback (most recent call last):

File "", line 1, in

myecho()

NameError: name 'myecho' is not defined

1.3 python包__all__列表

用法

# __init__.py

__all__ = ['dir1moda',]

描述

python用from dir1 import * 导入包模块时:

NO 描述

1

2

3

示例

# 目录结构:

# --dir1

# ----__init__.py

__init__.py已定义__all__列表,则只导入__all__列表内的模块。

__init__.py未定义__all__列表,则不会自动导入任何模块,只导入包,可以在__init__.py手动导入模块。

__all__写在import语句下面

# ----

# ----

# E:documentsF盘

print('在E:documentsF盘')

# E:documentsF盘

print('在E:documentsF盘')

# E:documentsF盘dir1__init__.py

import sys

__all__ = ['dir1moda',]

print('修改在dir1__init__.py')

a = 1

# 在 idle 执行下面示例

>>> import os

>>> path=r'E:documentsF盘'

>>> (path)

>>> from dir1 import *

修改在dir1__init__.py

在E:documentsF盘

# 在 __all__ 列表内的模块被自动导入,可访问

>>> dir1moda.s

'在E:documentsF盘'

# 非 __all__ 列表内的模块不自动导入,不可访问

>>> dir1modb.s

Traceback (most recent call last):

File "", line 1, in

dir1modb.s

NameError: name 'dir1modb' is not defined

# 修改__init__.py文件:E:documentsF盘dir1__init__.py,删除__all__

import sys

print('修改在dir1__init__.py')

a = 1

# 重启 idle 执行下面示例

>>> import os

>>> path=r'E:documentsF盘'

>>> (path)

>>> from dir1 import *

修改在dir1__init__.py

# 未定义__all__ ,不自动导入任何模块,不可访问

>>> dir1moda.s

Traceback (most recent call last):

File "", line 1, in

dir1moda.s

NameError: name 'dir1moda' is not defined

>>> dir1modb.s

Traceback (most recent call last):

File "", line 1, in

dir1modb.s

NameError: name 'dir1modb' is not defined

# 修改__init__.py文件:手动导入模块

import sys

from dir1 import dir1moda

print('修改在dir1__init__.py')

a = 1

# 重启 idle 执行下面示例

>>> import os

>>> path=r'E:documentsF盘'

>>> (path)

>>> from dir1 import *

在E:documentsF盘

修改在dir1__init__.py

# __init__.py 手动导入模块,可访问

>>> dir1moda.s

'在E:documentsF盘'

>>> dir1modb.s

Traceback (most recent call last):

File "", line 1, in

dir1modb.s

NameError: name 'dir1modb' is not defined


本文标签: 模块 导入 路径 目录 执行