python模塊導(dǎo)入import問(wèn)題徹底解決_第1頁(yè)
python模塊導(dǎo)入import問(wèn)題徹底解決_第2頁(yè)
python模塊導(dǎo)入import問(wèn)題徹底解決_第3頁(yè)
python模塊導(dǎo)入import問(wèn)題徹底解決_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、python 模塊導(dǎo)入 (import) 問(wèn)題徹底解決眾所周知, python 既可以導(dǎo)入包( import package ),也 可以導(dǎo)入模塊( import module ),package 一般理解為多文件 的模塊,它是這樣定義的, 如果一個(gè)目錄下存在” _init_.py ” 這個(gè)文件, 那么 python 就認(rèn)為這個(gè)目錄下的所有文件同屬于 一個(gè) package (這和 java 的 namespace有點(diǎn)像,但是 java 可 不需要這么個(gè)特殊文件) ,如果沒(méi)有這個(gè)文件,那么 python 認(rèn)為目錄下的 py 文件都是不相干的獨(dú)立模塊。但是在子目 錄中你可不能這么干,如果子目錄中沒(méi)

2、有”_init_.py ”,那么該目錄下的程序算是白寫(xiě)了,根本沒(méi)有辦法引用。當(dāng)然, 也不是絕對(duì)的, 除非繞個(gè)大彎兒: 設(shè)置當(dāng)前目錄, 然后導(dǎo)入, 然后重設(shè)當(dāng)前目錄。 比如,程序需要使用 test 目錄中的模塊, 而test目錄不是package,你只能這樣做:1: os.chdir(test)2: import testfuncs3: os.chdir(.)最方便的引入, 當(dāng)然是同一個(gè)目錄的模塊(除了及其簡(jiǎn)單的程序,很少有人會(huì) 使用這種扁平的目錄結(jié)構(gòu)) ,那是想怎么導(dǎo)入就怎么導(dǎo)入。 比如在主程序中想要使用另一個(gè)文件模塊中的函數(shù),只需要 直接導(dǎo)入即可: 1: import testfuncs #

3、直接導(dǎo)入模塊(也 就是不帶擴(kuò)展名的文件名) 2:3: testfuncs.nousefunc()#通過(guò)模塊的名字引用其中的函數(shù)4: from testfuncs importnousefunc #導(dǎo)入模塊中的函數(shù)5: nousefunc() #直接調(diào)用導(dǎo)入的函數(shù) 上面只是最簡(jiǎn)單的情況,如果文件中定義 的是class怎么樣呢,實(shí)際使用也是差不多的,不過(guò)要多一次構(gòu)造class的實(shí)例的調(diào)用:1: import testclass #直接導(dǎo)入模塊(也就是不帶擴(kuò)展名的文件名)2:obj=testclass.TestClass(); #實(shí)例化類3: obj.func1() # 通過(guò)模塊的名字引用其中的cl

4、ass然后才到類的函數(shù),注意類要實(shí)例 化 4: from testclass import TestClass #導(dǎo)入模塊中的類 5: obj=TestClass(); #實(shí)例化類 6: obj.func1() #調(diào)用函數(shù)如 果都是這種從程序中引入同目錄或者子目錄的包,那么事情 就簡(jiǎn)單了,但是如果是同為子目錄中的模塊,要引入兄弟目 錄中的模塊或類,要怎么辦呢?例如,如下的目錄結(jié)構(gòu):圖 中src目錄就是程序的頂層目錄,也是包導(dǎo)入的頂層package,pub目錄及其子目錄是公用程序所在。在這種情況下,最好 的方法就是在主程序中(一般位于應(yīng)用的源程序的根目錄 , 如圖中的start.py),把所有下

5、級(jí)的目錄都繳入的sys.path中,然后在子目錄中的模塊中,只要使用完全限定的包名引入其 他子目錄中的模塊或者類就可以了。然而現(xiàn)實(shí)的情況往往不 那么盡如人意, 比如為公用包寫(xiě)的測(cè)試程序需要放在 pub/test 目錄下,測(cè)試目標(biāo)在 pub/data 目錄下,這是不能寄希望與應(yīng) 用的主程序了, 因?yàn)榇藭r(shí)不會(huì)去運(yùn)行應(yīng)用程序。 這種情況下, 啟動(dòng)程序和被引用的包同在一個(gè)父目錄的子目錄中。此時(shí)該怎么辦呢,還是老辦法,要把父目錄(src/pub )和(src/pub/data、src/pub/test)目錄都要加入 sys.path中,然后再用絕對(duì)的方式 進(jìn)行引入 (import pub.data.da

6、tautil / from pub.data.datautil import DataUtil) 。每一個(gè)需要的模塊都要這么干,因此,我 特地寫(xiě)了一個(gè)函數(shù),來(lái)自動(dòng)的處理這種情況 :import os,sysimport TestClassimport testfuncs;from TestClass import TestClass;def _prepareRelativeImport(layer=2): 為相對(duì)引用做準(zhǔn)備,以便下層目錄中的模塊,相對(duì)引用本目錄以及父目錄和兄弟目錄中的模塊。參數(shù)layer,表示引入到多少層父目錄。 默認(rèn)為 2-> 引入本目錄和父目錄; 3-> 引入本

7、目錄、父目錄和祖父目錄。 import sys,os;curP=os.path.abspath(os.path.dirname(_file_);oriP=curP;_package_=curP.rpartition(os.path.sep)2; print(/r/ncurdir=,curP); while layer>=0:layer-=1;if not curP in sys.path:sys.path.append(curP);pa=curP.rpartition(os.path.sep);curN=pa2;pp=pa0;os.chdir(p p);#if _init_ in.join(os.listdir(curP):_import_(curN);curP=pp;os.chdir(oriP);if _name_=_main_:if not _file_ indir():_file_=os.path.abspath(.)+os.path.sep+1.py;_prepareRelativeImport(2) from TestClass import TestClass; from pub.test.TestClass import TestClass; from pub.data.CompareOperator import CompareOperat

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論