Python包的導入方式(全)



  說明:
代碼基於 PyCharm2019.1 IDE平臺下的python3環境執行



請使用桌面瀏覽器,以便瀏覽正常

代碼目錄結構圖

(此目錄說明文字同時也是相關圖片的鏈接形式,點擊跳轉後即可瀏覽;下同)



# -*- coding:utf-8 -*-
def aPrint() -> object:
    print("This is a print test from A.py")

def sayHello() -> object:
    print("Helllo my friend long time no see - saying from A.py")
    
A.py文件

# -*- coding:utf-8 -*-
def bPrint():
    print("This is a print test from B.py")

def sayHello() -> object:
    print("Helllo my friend long time no see - saying from B.py")
B.py文件

# -*- coding:utf-8 -*-
def cPrint():
    print("This is a print test from C.py")

def sayHello() -> object:
    print("Helllo my friend long time no see - saying from C.py")
C.py文件
# __init__.py文件,裏面可以寫import C 時要執行的代碼,當然也可以留空
# 不過往往可以用於進行預處理操作
print("information output from __init__.py in dirPagC.")
# 值得注意的是:import C 若是通過絕對路徑添加、在靜態編譯時無法識別時的話
# __init__.py中的代碼不會被執行
# 另外多次 import 也只會是默認執行且只執行一次 __init__.py中的代碼
與之同目錄下的__init__.py文件

# -*- coding:utf-8 -*-
import A

A.aPrint()
callA1.py文件

# -*- coding:utf-8 -*-
from A import aPrint

aPrint()
callA2.py文件

# -*- coding:utf-8 -*-

# 調用文件與被調用文件所在的目錄並列時,調用格式需要添加路徑
# 由於是並列目錄,故共同的“根”路徑可以不寫,即:
# dirName 其本質是 需要導入的python包的絕對路徑名而非僅僅是所處的文件夾名
# 只不過此處是使用了基於當前文件夾目錄下的相對路徑來替代表示而已
######### 1 ##########
# # import dirName.pyFileName
# import dirB.B
# dirB.B.bPrint()
########## 2 ##########
# # form dirName import pyFileName
# from dirB import B
# B.bPrint()
########## 3 ##########
# # from dirName.pyFileName import funtionName
# from dirB.B import bPrint
# bPrint()
########## 4 ##########
import sys
sys.path.append('E:\Code\Python\MyMoudle\dirB')
import B
B.bPrint()
# 絕對路徑是通用的包引入辦法
# 引入的包在靜態編譯時是無法識別的
# 動態編譯後纔會識別,能夠正常運行

########## 5 ##########
# # import sys
# # sys.path.append('E:\Code\Python\MyMoudle')
# import dirB.B
# dirB.B.bPrint()
# 這第5種方式與第一種其實是一個樣子
# 實在要靈活運用,可以看一下第6種方式
########## 6 ##########
import sys
sys.path.append('E:\Code')
import Python.MyMoudle.dirB.B
Python.MyMoudle.dirB.B.bPrint()
# 需要說明的是,以下方式目前的編譯器暫時不支持
# sys.path.append('E:')
# import Code.Python.MyMoudle.dirB.B
# Code.Python.MyMoudle.dirB.B.bPrint()
# 即:sys.path.append添加的路徑最終必須是落在某個文件夾裏
# 而絕非可以是整個磁盤的添加
callB.py文件
代碼視圖補充

# -*- coding:utf-8 -*-

# 調用文件與被調用文件所在的目錄並列時,調用格式需要添加路徑
# 由於是並列目錄,故共同的“根”路徑可以不寫,即:
# dirName 其本質是 需要導入的python包的絕對路徑名而非僅僅是所處的文件夾名
# 只不過此處是使用了基於當前文件夾目錄下的相對路徑來替代表示而已

# ######## 1 ##########
# # import dirName.pyFileName
import dirPagC.C
dirPagC.C.cPrint()
# ######### 2 ##########
# # form dirName import pyFileName
from dirPagC import C
C.cPrint()
# ######### 3 ##########
# # from dirName.pyFileName import funtionName
from dirPagC.C import cPrint
cPrint()
# # ######### 4 #########
import sys
sys.path.append('E:\Code\Python\MyMoudle\dirPagC')
import C
C.cPrint()
# 絕對路徑是通用的包引入辦法
# 引入的包在靜態編譯時是無法識別的
# 動態編譯後纔會識別,能夠正常運行

callC.py文件
代碼視圖補充

# -*- coding:utf-8 -*-

# dirName 其本質是 需要導入的python包的絕對路徑名而非僅僅是所處的文件夾名
# 只不過此處是使用了基於當前文件夾目錄下的相對路徑來替代表示而已
# 說到底就兩種類別
# 1. import (dir.)pyFileName
# 使用py文件下的多個方法
# 2. from (dir.)pyFileName import funtionName
# 使用py文件下的指定方法

# 同級目錄或者是子目錄往父目錄直接調用
# 兩者調用格式
########## 1 ##########
# import pyFileName
# import A
# A.aPrint()
########## 2 ##########
# from pyFileName import funtionName
from A import aPrint
aPrint()

# 並列目錄的調用,調用格式需要添加路徑
# 由於是並列目錄,故共同的“根”路徑可以不寫
########## 1 ##########
# import dirName.pyFileName
# import dirB.B
# dirB.B.bPrint()
########## 2 ##########
# form dirName import pyFileName
# from dirB import B
# B.bPrint()
########## 3 ##########
# from dirName.pyFileName import funtionName
from dirB.B import bPrint
bPrint()

# C.py處於包文件夾dirPagCall中,有別於B.py處於普通文件夾dirCall中
########## 1 ##########
# import packageDirName.pyFileName
# import dirPagC.C
# dirPagC.C.cPrint()
########## 2 ##########
# form packageDirName import pyFileName
# from dirPagC import C
# C.cPrint()
# dirPagC.C.cPrint() # 只能怪識別 import後的內容,故此行代碼將會報無法識別dirPagC的錯誤
########## 3 ##########
# from packageDirName.pyFileName import funtionName
from dirPagC.C import cPrint
cPrint()
# dirPagC.C.cPrint()
# C.cPrint() # 同理,此二行會報無法識別的錯誤
toCallABC.py文件

# -*- coding:utf-8 -*-

# import A
# A.sayHello()
from dirB.B import sayHello
from A import sayHello
sayHello()
sayHello()

# import dirB.B
# dirB.B.sayHello()
# from dirB import B
# B.sayHello()
from dirB.B import sayHello
sayHello()

# import dirPagC.C
# dirPagC.C.sayHello()
# from dirPagC import C
# C.sayHello()
from dirPagC.C import sayHello
sayHello()

# import dirPagC
# dirPagC.C.sayHello()
# 查到的方法說是 這第四種也可以
callABC.py文件
同名方法如何使用“命名空間”

可以類比其他存在命名空間概念的語言(C、C++、C#、……)通過包.方法名實現區分;有關就近匹配原則,詳情可看上圖鏈接

最後補充:有關__init__.py文件

  __init__.py 預處理代碼,import時執行,多次import也只執行1次

2019/11/08 00:33



# 補充一種包的引入方式,可能存在爭議

import dirB
dirB.B.sayHello()

import  dirPagC
dirPagC.C.sayHello()
有無__init__.py目前已沒有區別

直接import文件夾,以前的說法是:當 普通文件夾存在__init__.py文件時,會變成包文件夾,之後可以像引入普通的包一樣,import 文件夾(目前經過測試,有無__init__.py均可以如此引入)

以上知識均通過親歷測試,若有錯誤歡迎在留言區糾正,一切以官方開發文檔爲準。

2019/11/08 00:52

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章