1、在Python中以相對(duì)路徑或者絕對(duì)路徑來(lái)導(dǎo)入文件或者模塊的方法
今天在調(diào)試代碼的時(shí)候,程序一直提示沒(méi)有該模塊,一直很納悶,因?yàn)槲覍?dǎo)入文件一直是用絕對(duì)路徑進(jìn)行導(dǎo)入的。按道理來(lái)講是不會(huì)出現(xiàn)模塊找不到的情況的。
最后仔細(xì)分析了整個(gè)代碼的目錄結(jié)構(gòu),才發(fā)現(xiàn)了問(wèn)題。
下面依次來(lái)說(shuō)明一下今天的情況
先看導(dǎo)入的代碼:
在demo――mnist.py文件中執(zhí)行以下兩種導(dǎo)入操作 # 第一處 from gcforest.gcforest import GCForest from gcforest.utils.config_utils import load_json # 第二處 config = load_json("demo_mnist-ca.json") # 里面?zhèn)魅氲氖俏募奈恢茫@個(gè)函數(shù)是讀取配置文件的內(nèi)容
然后看一下目錄的結(jié)構(gòu)
在此例中,demo_mnist,py為主文件。它第一處要導(dǎo)入的是它當(dāng)前目錄的父目錄下的一個(gè)子目錄中的一個(gè)目錄中的文件。
所以以絕對(duì)路徑導(dǎo)入這個(gè)文件就是
from lib.gcforest.gcforet import GCForest
以相對(duì)路徑導(dǎo)入這個(gè)文件就是
from ..gcforest.gcforet import GCForest
第二處導(dǎo)入的是它統(tǒng)一個(gè)目錄下的另一個(gè)文件,所以可以直接導(dǎo)入
所以修改的導(dǎo)入代碼為:
config = load_json("demo_mnist-ca.json")
2、 順便復(fù)習(xí)一下相對(duì)路徑和絕對(duì)路徑的概念
絕對(duì)路徑就是文件的真正存在的路徑,是指從硬盤(pán)的根目錄(盤(pán)符)開(kāi)始,進(jìn)行一級(jí)級(jí)目錄指向文件。
相對(duì)路徑就是以當(dāng)前文件為基準(zhǔn)進(jìn)行一級(jí)級(jí)目錄指向被引用的資源文件。
以下是常用的表示當(dāng)前目錄和當(dāng)前目錄的父級(jí)目錄的標(biāo)識(shí)符
../ 表示當(dāng)前文件所在的目錄的上一級(jí)目錄
./ 表示當(dāng)前文件所在的目錄(可以省略)
/ 表示當(dāng)前站點(diǎn)的根目錄(域名映射的硬盤(pán)目錄)
在Python中可以驗(yàn)證一下上述的標(biāo)識(shí)方法:
測(cè)試的目錄結(jié)構(gòu):
import os path1=os.path.abspath('.') # 表示當(dāng)前所處的文件夾的絕對(duì)路徑 print(path1) path2=os.path.abspath('..') # 表示當(dāng)前所處的文件夾上一級(jí)文件夾的絕對(duì)路徑 print(path2)
# D:/PycharmProjects/mnistCheck/AbsolutepathAndrelativepath.py D:\PycharmProjects\mnistCheck D:\PycharmProjects
3、 再了解一下Python sys.path的使用
sys.path是python的搜索模塊的路徑集,是一個(gè)list,如下:
[ 'D:\\PycharmProjects\\mnistCheck', 'D:\\PycharmProjects\\mnistCheck', 'D:\\PycharmProjects\\KerasDataSettry', 'C:\\ProgramData\\Anaconda3\\envs\\tensorflow\\python35.zip', 'C:\\ProgramData\\Anaconda3\\envs\\tensorflow\\DLLs', 'C:\\ProgramData\\Anaconda3\\envs\\tensorflow\\lib', 'C:\\ProgramData\\Anaconda3\\envs\\tensorflow', 'C:\\ProgramData\\Anaconda3\\envs\\tensorflow\\lib\\site-packages', 'C:\\ProgramData\\Anaconda3\\envs\\tensorflow\\lib\\site-packages\\Sphinx-1.6.3-py3.5.egg' ]
可以在python 環(huán)境下使用: .
sys.path.append(‘你的模塊的名稱')。 sys.path.insert(0,'模塊的名稱')
添加相關(guān)的路徑,但在退出python環(huán)境后自己添加的路徑就會(huì)自動(dòng)消失!
代碼中的實(shí)現(xiàn)如下:
import sys sys.path.append('C:\Users\Administrator\Desktop\ExperimentAss\gcForest-master')
4、最后了解一下 python 在不同層級(jí)目錄import 模塊的方法(重點(diǎn))
有一個(gè)文件夾/home/a, 里面有個(gè)模塊叫b.py, 我怎么把他import到程序里?
方法一: ?? (屬于剛開(kāi)始分析的代碼里第一種情況)
import sys; sys.path.append(“/home/a/”) import b
方法二:
在目錄里面增加__init__.py文件,里面可以寫(xiě)import時(shí)執(zhí)行的代碼,當(dāng)然也可以留空就可以.
import home.a.b
方法三:
from home.a.b import *
前提 home、a中都包括__init__.py 即:要導(dǎo)入的文件的當(dāng)前目錄和父目錄都要有 init .py文件
Python包含子目錄中的模塊方法比較簡(jiǎn)單,關(guān)鍵是能夠在sys.path里面找到通向模塊文件的路徑。
下面將具體介紹幾種常用情況:
(1)主程序與模塊程序在同一目錄下:
如下面程序結(jié)構(gòu):
?C src ? |?C mod1.py ? |?C test1.py
若在程序test1.py中導(dǎo)入模塊mod1, 則直接使用import mod1或from mod1 import *;
(2)主程序所在目錄是模塊所在目錄的父(或祖輩)目錄
如下面程序結(jié)構(gòu):
?C src |?C mod1.py |?C mod2 ? | ?C mod2.py ?C test1.py
若在程序test1.py中導(dǎo)入模塊mod2, 需要在mod2文件夾中建立空文件__init__.py文件(也可以在該文件中自定義輸出模塊接口); 然后使用 from mod2.mod2 import * 或import mod2.mod2.
(3)主程序?qū)肷蠈幽夸浿心K或其他目錄(平級(jí))下的模塊
如下面程序結(jié)構(gòu):
?C src ? |?C mod1.py ? |?C mod2 ? ?|?C mod2.py ? |?C sub ? ? | ?C test2.py ? ?C test1.py
若在程序test2.py中導(dǎo)入模塊mod1.py和mod2.py。首先需要在mod2下建立__init__.py文件(同(2)),src下不必建立該文件。然后調(diào)用方式如下:
下面程序執(zhí)行方式均在程序文件所在目錄下執(zhí)行,如test2.py是在cd sub;之后執(zhí)行python test2.py
而test1.py是在cd src;之后執(zhí)行python test1.py; 不保證在src目錄下執(zhí)行python sub/test2.py成功。
import sys sys.path.append(“..”) import mod1 import mod2.mod2
(4)從(3)可以看出,導(dǎo)入模塊關(guān)鍵是能夠根據(jù)sys.path環(huán)境變量的值,找到具體模塊的路徑。這里僅介紹上面三種簡(jiǎn)單情況。
總結(jié):
通過(guò)總結(jié)可以發(fā)現(xiàn),當(dāng)你要導(dǎo)入的文件在和你的當(dāng)前文件在同一個(gè)目錄時(shí),你直接導(dǎo)入這個(gè)文件名就好了。
當(dāng)你要導(dǎo)入的文件或者目錄不和你的當(dāng)前文件同目錄時(shí),你需要跳到這個(gè)你要導(dǎo)入文件的父級(jí)目錄,然后一級(jí)一級(jí)的用點(diǎn)號(hào)連接走過(guò)的目錄或者文件,然后就可以了 至于要怎么跳到這個(gè)這個(gè)父級(jí)目錄。比較通用的就是,將父級(jí)目錄加入系統(tǒng)路徑,然后用點(diǎn)號(hào)一級(jí)一級(jí)的尋找,直到到達(dá)你要導(dǎo)入的模塊。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
