Python中模塊與包的導入(朴實易懂版的總結)


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

基本注意點

  1. 模塊:一般指一個py文件;包:含有許多py文件的文件夾,含有 或不含有(Python3中允許)__init__文件。
  2. 凡是在導入時帶點的,點的左邊都必須是一個包 (import a.fun1 其中a為py文件)這種導入形式是錯誤的。
    2.from a import fun1 a為一個py文件,fun1為該文件的屬性或方法,這種導入形式是可以的。
  3. 一般來說 import 后面不能帶點,如:(from a import b.c是錯誤語法)
  4. 導入模塊時,是將模塊的py文件導入進去(執行);導入包時,只會執行包中的__init__文件中的代碼,故導入包時一般要導入到最底層,即from dir1.dir2.dir3 import py文件或者類、方法、屬性,只有這樣才能找到。但是你可以通過先導入一個包,然后在包的文件中的__init__中寫相關的import語句(可以絕對,也可以相對),這樣也可以通過import 包名 的方式將包中的東西導入進去。
    例如:

文件結構

文件結構示意圖

示例1

  • 以p0.py為直接執行文件,如在p0文件輸入:
import bin
  • 在bin文件夾的__init__.py文件中輸入:
from . import  dir  # 相對導入   或者絕對導入: from bin  import dir 
  • 最后,在dir 的__init__.py文件中輸入:
from . import p3 
# 注意,這時的絕對導入必須為:
from bin.dir import p3
# 因為:后面第四條的給出了原因,dir並不在此時的sys.path中
  • 通過以上語句,就能實現從po文件中,僅僅通過import bin 就能導入p3文件去po里面
  1. 直接執行某個py文件時,會將當前py文件所在的目錄添加到sys.path中,而其它模塊被被導入其中時並不會將其它模塊所在的目錄放進sys.path中。
  2. 用相對路徑導入: “.”表示當前目錄,“..”表示上一層目錄,注意這里的當前表示要導入的某個py文件所在的目錄,上一層同理。相對導入時不用考慮是否在sys.path中,一般寫在一個包中的__init__文件中。常用於包外使用,從包外某個py文件導入包內某些文件。見示例1的模式

Python import 的搜索路徑(即sys.path)

  • 在當前目錄下搜索該模塊,(注意在pycharm中,pycharm會將你的項目路徑添加到sys.path中),從這里看出,你所導入到的模塊或者包或者模塊所在的包,必須是與直接執行的文件同級,
    例如 示例1:直接直接執行p0.py sys.path 添加的就是 test目錄,那么只有 bin、main 能搜索到,所以from bin.dir import p3是可以的。
  • 在環境變量 PYTHONPATH 中指定的路徑列表中依次搜索
  • 在 Python 安裝路徑的 lib 庫中搜索

軟件開發規范


這是程序文件結構的一般規范,里面涉及到包與模塊的導入問題

  • ①為了能在bin文件下的start.py文件中引入core文件夾下的core.py中的main()函數,(即跨同一目錄下的 兩個包導入,一般需要將兩包的共有目錄添加到sys.path中)
    start.py文件代碼為:(為通用格式)
import os
import sys
sys.path.append(os.path.dirname(os.getcwd()))
from core import  core  # 注意第一個core為包名,第二為py文件名
if __name__ == '__main__':
    core.main()
  • ②假如,core文件中寫了兩個py文件,一個為core.py,另一個為 log_in.py ,為了能在core.py中導入log_in模塊,
# 方法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中
參考:https://www.cnblogs.com/linhaifeng/articles/6379069.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM