Python中模組與包的匯入(樸實易懂版的總結)

2022-07-16 08:33:08 字數 1665 閱讀 8608

這幾天,被python包與模組的匯入問題,折磨的不行,以前想的很簡單,其實不然,經查資料研究,特總結如下:

模組:一般指乙個py檔案;包:含有許多py檔案的資料夾,含有 或不含有(python3中允許)__init__檔案。

凡是在匯入時帶點的,點的左邊都必須是乙個包 (import a.fun1 其中a為py檔案)這種匯入形式是錯誤的。

2.from a import fun1 a為乙個py檔案,fun1為該檔案的屬性或方法,這種匯入形式是可以的。

一般來說 import 後面不能帶點,如:(from a import b.c是錯誤語法)

匯入模組時,是將模組的py檔案匯入進去(執行);匯入包時,只會執行包中的__init__檔案中的**,故匯入包時一般要匯入到最底層,即from dir1.dir2.dir3 import py檔案或者類、方法、屬性,只有這樣才能找到。但是你可以通過先導入乙個包,然後在包的檔案中的__init__中寫相關的import語句(可以絕對,也可以相對),這樣也可以通過import 包名 的方式將包中的東西匯入進去。

例如:

import bin
from . import  dir  # 相對匯入   或者絕對匯入: from bin  import dir
from . import p3 

# 注意,這時的絕對匯入必須為:

from bin.dir import p3

# 因為:後面第四條的給出了原因,dir並不在此時的sys.path中

直接執行某個py檔案時,會將當前py檔案所在的目錄新增到sys.path中,而其它模組被被匯入其中時並不會將其它模組所在的目錄放進sys.path中。

用相對路徑匯入: 「.」表示當前目錄,「..」表示上一層目錄,注意這裡的當前表示要匯入的某個py檔案所在的目錄,上一層同理。相對匯入時不用考慮是否在sys.path中,一般寫在乙個包中的__init__檔案中。常用於包外使用,從包外某個py檔案匯入包內某些檔案。見示例1的模式

這是程式檔案結構的一般規範,裡面涉及到包與模組的匯入問題

import os

import sys

from core import core # 注意第乙個core為包名,第二為py檔名

if __name__ == '__main__':

core.main()

# 方法1

import log_in

方法1是錯的,因為程式的主入口(直接執行的)為start.py檔案,又由於新增了專案目錄(soft)到sys.path中,故此時sys.path中含有 bin、soft、其它python直譯器檔案路徑,所以無法匯入

# 方法2

from core import log_in

方法2是對的 ,因為start.py中已新增專案目錄(soft)到sys.path中

參考:

python模組匯入與模組包匯入

main.py程式第一次匯入指定檔案mod.py時,執行 找到模組檔案mod.py 編譯成位元組碼 可選 執行.pyc位元組碼,建立mod.py中定義的物件。匯入模組後,模組物件會被儲存在sys.modules的表中。每次匯入時,若此表中已存在相關模組,以上3步會被跳過。1.搜尋模組檔案 按順序 程...

python 匯入不同包中的模組

如果我們要匯入的模組在不同的包中,該如何匯入呢?可以用from 包名 import 模組名或者from 包名.模組名 import 模組中的 如變數 函式 方法等 方式一 匯入整個模組,即from 包名 import 模組名 如下圖結構,有package01包 test.py在其中 和package...

python 包 模組匯入

os.getenv path 系統可執行程式位置 sys.path可匯入的python包位置 python module 的 path 屬性 可顯示每個包的檔案位置 what is pythonpath,what is python package what can we do with init ...