1. 程式人生 > >python3中的包和模組

python3中的包和模組

新建一個package

以pycharm為例,編譯工具的左側是專案欄(即project),在專案欄中需要新建包的位置點選滑鼠右鍵,在下拉選單中可以看到new選項,通過new選項中的Python Package可以新建一個Python包,此包中會自動生成一個__init__.py檔案,這也是pycharm中python包和一般目錄的主要區別。 如圖,可以看到有Directory和Python Package兩個選項: 在這裡插入圖片描述

選擇Python Package:在這裡插入圖片描述 當我們從外部引用一個Python包時,首先引用的是包中的__init__.py檔案,也可以說我們匯入一個包,其實就是匯入了此包中的__init__.py這個模組。

新建一個模組

新建模組,即新建一個Python檔案:在這裡插入圖片描述

如圖,我們新建一個msg.py模組。在此模組中,定義一個msg變數、一個test()方法、一個Person()類以待呼叫

msg = "定義一個msg模組變數"

def test():
    print("這是一個beUsed模組中的函式")

class Person():
    pass

呼叫模組

剛剛新建了一個msg.py模組,現在來在其他的python檔案中呼叫這個模組。 首先,在同級路徑下新建test.py檔案,建完以後我們的目錄下面共有三個檔案: 在這裡插入圖片描述

絕對引入

在test.py中如果我們直接引入msg模組,即直接寫import msg,此時的msg下方會出現紅色波浪線的錯誤標記,但如果我們無視這個報錯,而在後面接著呼叫msg中的msg變數,會發現msg變數可以被呼叫。 在這裡插入圖片描述

也就是說此處對於msg模組的呼叫是成功的,那麼為什麼系統會在程式中報錯呢?

pycharm中的最上層資料夾是project資料夾,當在沒有from的情況下執行import時,預設是從project資料夾中尋找,而此處的msg.py的父級目錄test1是project目錄下的子目錄,在執行之前並不能找到此處路徑。我們稱這種引入方式為絕對引入。

相對引入

既然有絕對引入,相對應的就會有相對引入。當我們使用上文中的方法時,雖然程式碼中會出現彆扭的紅線,但是實際上並不影響執行結果。那麼,我們使用相對路徑是不是就不會出現這條紅線了呢? 在這裡插入圖片描述 如圖所示,當我們在當前目錄下呼叫msg模組時,確實沒有出現“No module named msg”這樣的提示與紅線,但是在執行的時候卻發生了錯誤:“ImportError: cannot import name ‘msg’ ”——不能引入名叫"msg"的模組

會發生這樣的情況,是因為“from . import msg”中的“.”指的是當前目錄,而此時的系統中並沒有指定當前目錄。當pycharm對引入的模組進行查詢時,它是從.site-packages、 pythonpath、 sys.path、 當前路徑這四個路徑下查詢是否有所用模組。當使用linux或cmd命令提示符的時候我們可以人為的設定當前路徑,那麼pycharm當然也有設定當前路徑的方法。 用滑鼠右鍵點選需要引用的msg模組的上級目錄,即test1,在選單中會出現一個名叫Mark Directory as的專案。在這裡插入圖片描述 選擇該選項中的Sources Root,再來看所需要用到的test1目錄。 在這裡插入圖片描述可以看到此時test1目錄的圖示變成了藍色,這也就意味著他被標記成了pycharm中“當前目錄”的一員。