最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python如何使用import引入其他目錄文件或自定義模塊

 更新時(shí)間:2024年02月26日 14:56:48   作者:雪的期許  
這篇文章主要介紹了python如何使用import引入其他目錄文件或自定義模塊方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

問題描述

在python工程中,常常需要使用import引入自己編寫的其他模塊,但其它模塊有時(shí)不在同一個(gè)文件夾下。

此時(shí)直接import會(huì)導(dǎo)致找不到包而報(bào)錯(cuò)

ModuleNotFoundError: No module named '****'

下面提供2種解決方案。

解決方案

以下面的項(xiàng)目結(jié)構(gòu)為例進(jìn)行說明。


方案1:使用相對路徑(局限)

在import時(shí)直接使用相對路徑

  • .代表當(dāng)前文件所在路徑
  • ..代表當(dāng)前文件的父目錄
  • ...代表爺爺目錄,以此類推,每多一個(gè)點(diǎn),就向上翻一層目錄。

例1,在f1.py中寫:

from ..p2 import f2.py

例2,在t1.py中寫:

from ..b import t2.py

這樣寫能否執(zhí)行成功,取決于主函數(shù)入口(即你執(zhí)行的文件)!記住這個(gè)原則(局限):

相對路徑所涉及的目錄范圍內(nèi)不允許有主函數(shù)入口

不滿足這個(gè)原則時(shí),報(bào)錯(cuò)

ValueError: attempted relative import beyond top-level package

在上面的項(xiàng)目結(jié)構(gòu)中,如果我們執(zhí)行python main.py,那么在main.py中引入t1.py會(huì)報(bào)錯(cuò),

原因是t1.py中使用相對引入時(shí),..回退到的目錄是項(xiàng)目主目錄,也就是main.py所在的目錄,違反了該原則。

但在main.py中引入f1.py是正確的,因?yàn)?code>f1.py在使用相對路徑引入時(shí)最多回退到pkg文件夾,不會(huì)影響main.py的執(zhí)行。

方案2:絕對路徑引入(推薦)

1. 在main.py中調(diào)用t1.py

這個(gè)很常規(guī),直接在main.py使用import即可

form a.t1 import *

2. 在t1.py中調(diào)用main.py

t1.py中寫:

import sys
from pathlib import Path
sys.path.append(str(Path(__file__).resolve().parents[1]))  # 將父級目錄加入執(zhí)行目錄列表

from main import *  # 由于main.py所在目錄已加入到sys.path,可直接引入

代碼中parents返回一個(gè)列表,parents[0]代表該文件所在目錄,下標(biāo)每加一,目錄向上一層,所以這里parents[1]得到的是父目錄。

3. 幾個(gè)坑

1. os.getcwd()

  • 這個(gè)函數(shù)獲取的始終是當(dāng)前終端所在目錄。
  • 例如我的終端現(xiàn)在處在/home/code/下,執(zhí)行python a/1.py,文件1.py中的語句os.getcwd()返回值為/home/code/。

2. __file__

  • 當(dāng)前文件相對于終端的路徑
  • 例如我的終端現(xiàn)在處在/home/code/下,執(zhí)行python a/1.py,文件1.py中的語句__file__返回值為a/1.py
  • 使用os.path.abspath(__file__)可獲得該文件的絕對路徑/home/code/a/1.py。
  • Tips:拼接路徑os.getcwd()/__file__就是該文件的完整絕對路徑。

3. sys.path[0]

  • 直接運(yùn)行py文件,即python xxx.py時(shí),為執(zhí)行文件所在的絕對目錄(不管終端處于什么路徑)。
  • 需要注意,若執(zhí)行python 1.py,而1.py中又import了其他目錄的2.py,那么2.pysys.path[0]1.py中相等,也就是說在import其他文件時(shí),其他文件的sys.path[0]將以當(dāng)前被執(zhí)行的文件為準(zhǔn)。
  • 以模塊運(yùn)行時(shí),即python -m xxx時(shí),為終端所在絕對目錄,等于os.getcwd()。

4. 小結(jié)

  • .py文件中,使用__file__最保險(xiǎn)。
  • 但是在.ipynb文件中不存在__file__變量,怎么辦?
  • 由于.ipynb文件一般不考慮被其他文件import,因此直接使用sys.path[0]取得文件所在目錄即可。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

临洮县| 东至县| 新河县| 永春县| 金湖县| 贺州市| 新泰市| 神池县| 龙海市| 达日县| 灵川县| 天气| 钟祥市| 河西区| 右玉县| 滨海县| 永州市| 东至县| 林口县| 彭泽县| 磴口县| 屏东县| 科技| 武平县| 通州市| 宣武区| 天柱县| 利津县| 金湖县| 延长县| 贵州省| 来安县| 阿拉善左旗| 敦化市| 响水县| 富民县| 定远县| 苍溪县| 九台市| 兴山县| 轮台县|