原創文章,歡迎轉載。轉載請註明:轉載自 祥的博客
原文鏈接:https://blog.csdn.net/humanking7/article/details/88368950
Python自定義包及3種包導入方式
1.自定義包
包
就是一個至少包含__init__.py
文件的文件夾,這個文件是必須存在的,否則,Python
就把這個目錄當成普通目錄(文件夾),而不是一個包
。__init__.py
可以是空文件,也可以有Python代碼
,因爲__init__.py
本身就是一個模塊,而它的模塊名就是對應包的名字。調用包就是執行包下的__init__.py
文件。
以下自定義了一個包,包所在的目錄爲D:\Code_Sources\Python\Test\
,即就是這個目錄下有個叫parent
的包。
1.1. parent 目錄中的文件
init.py
# parent 的 __init__.py
if __name__ == '__main__':
print('parent 作爲主程序運行')
else:
print('parent 初始化')
1.2. pack 目錄中的文件
init.py
# Pack 的 __init__.py
if __name__ == '__main__':
print('作爲主程序運行')
else:
print('Pack初始化')
mod.py
# mod
def func():
print('pack.mod.func()')
if __name__ == '__main__':
print('mod 作爲主程序運行')
else:
print('mod 被另一個模塊調用')
1.3. pack2 目錄中的文件
init.py
# Pack2 的 __init__.py
# __all__ 用於當前Pack2包是所包含的模塊
__all__ = ["mod2_1", "mod2_2", "mod2_3"]
if __name__ == '__main__':
print('Pack2作爲主程序運行')
else:
print('Pack2初始化')
mod2_1.py
# mod2
def func():
print('pack2.mod2_1.func()')
if __name__ == '__main__':
print('mod2_1 作爲主程序運行')
else:
print('mod2_1 被另一個模塊調用')
mod2_2.py
# mod2
def func():
print('pack2.mod2_2.func()')
if __name__ == '__main__':
print('mod2_2 作爲主程序運行')
else:
print('mod2_2 被另一個模塊調用')
2.導入(自定義)包的3種方法
我在桌面C:\Users\Administrator\Desktop\
新建了一個main.py
文件**(和自定義的包不在一個目錄)**,自定義包的目錄:D:\Code_Sources\Python\Test\
import sys
# 將包含parent包的路徑添加進系統路徑
sys.path.append(r"D:\Code_Sources\Python\Test")
print('-----開始import-----\n')
import parent.pack2.mod2_1 # 第1種 引用方法
import parent.pack2.mod2_2 as p2m2 # 第2種 引用方法
from parent.pack.mod import * # 第3種 引用方法
if __name__ == '__main__':
print('-----開始main-----\n')
# 第1種 引用的調用方法
parent.pack2.mod2_1.func()
# 第2種 引用的調用方法
p2m2.func()
# 第3種 引用的調用方法
func()
# import就會把註冊在包 __init__.py 文件中 __all__列表中的子模塊和子包導入到當前作用域中
print('\npack2包中的模塊有:')
print(parent.pack2.__all__)
運行結果:
-----開始import-----
parent 初始化
Pack2初始化
mod2_1 被另一個模塊調用
mod2_2 被另一個模塊調用
Pack初始化
mod 被另一個模塊調用
-----開始main-----
pack2.mod2_1.func()
pack2.mod2_2.func()
pack.mod.func()
pack2包中的模塊有:
['mod2_1', 'mod2_2', 'mod2_3']
請按任意鍵繼續. . .