python模塊導入import問題徹底解決_第1頁
python模塊導入import問題徹底解決_第2頁
python模塊導入import問題徹底解決_第3頁
python模塊導入import問題徹底解決_第4頁
全文預覽已結(jié)束

下載本文檔

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

文檔簡介

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

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

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

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

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

6、tautil / from pub.data.datautil import DataUtil) 。每一個需要的模塊都要這么干,因此,我 特地寫了一個函數(shù),來自動的處理這種情況 :import os,sysimport TestClassimport testfuncs;from TestClass import TestClass;def _prepareRelativeImport(layer=2): 為相對引用做準備,以便下層目錄中的模塊,相對引用本目錄以及父目錄和兄弟目錄中的模塊。參數(shù)layer,表示引入到多少層父目錄。 默認為 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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論