<abbr id="ciwa6"><option id="ciwa6"></option></abbr>
  • <sup id="ciwa6"><kbd id="ciwa6"></kbd></sup>
    <small id="ciwa6"></small>
  • 千鋒教育-做有情懷、有良心、有品質的IT職業教育機構

    你所在的位置:首頁 > 常見問題

    Python模塊的搜索路徑有哪些?

    時間:2017-12-11 15:14:54 來源:千鋒教育  作者:千鋒

       模塊的搜索路徑都放在了sys.path列表中,如果缺省的sys.path中沒有含有自己的模塊或包的路徑,可以動態的加入(sys.path.apend)即可。下面是sys.path在Windows平臺下的添加規則。

      1、sys.path個路徑往往是主模塊所在的目錄。在交互環境下添加一個空項,它對應當前目錄。

      2、如果PYTHONPATH環境變量存在,sys.path會加載此變量指定的目錄。

      3、我們嘗試找到Python Home,如果設置了PYTHONHOME環境變量,我們認為這就是Python Home,否則,我們使用python.exe所在目錄找到lib/os.py去推斷Python Home。

      如果我們確實找到了Python Home,則相關的子目錄(Lib、plat-win、lib-tk等)將以Python Home為基礎加入到sys.path,并導入(執行)lib/site.py,將site-specific目錄及其下的包加入。

      如果我們沒有找到Python Home,則把注冊表Software/Python/PythonCore/2.5/PythonPath的項加入sys.path(HKLM和 HKCU合并后加入),但相關的子目錄不會自動添加的。

      4、如果我們沒有找到Python Home,并且沒有PYTHONPATH環境變量,并且不能在注冊表中找到PythonPath,那么缺省相對路徑將加入(如:./Lib;./plat-win等)。

      總結如下

      當在安裝好的主目錄中運行Python.exe時,首先推斷Python Home,如果找到了PythonHome,注冊表中的PythonPath將被忽略;否則將注冊表的PythonPath加入。

      如果PYTHONPATH環境變量存在,sys.path肯定會加載此變量指定的目錄。

      如果Python.exe在另外的一個目錄下(不同的目錄,比如通過COM嵌入到其他程序),Python Home將不推斷,此時注冊表的PythonPath將被使用。

      如果Python.exe不能發現他的主目錄(PythonHome),并且注冊表也沒有PythonPath,則將加入缺省的相對目錄。

      標準Import

      Python中所有加載到內存的模塊都放在sys.modules。當import一個模塊時首先會在這個列表中查找是否已經加載了此模塊,如果加載了則只是將模塊的名字加入到正在調用import的模塊的Local名字空間中。如果沒有加載則從sys.path目錄中按照模塊名稱查找模塊文件,模塊文件可以是py、pyc、pyd,找到后將模塊載入內存,并加入到sys.modules中,并將名稱導入到當前的Local名字空間。

      可以看出了,一個模塊不會重復載入。多個不同的模塊都可以用import引入同一個模塊到自己的Local名字空間,其實背后的PyModuleObject對象只有一個。

      說一個容易忽略的問題,import只能導入模塊,不能導入模塊中的對象(類、函數、變量等)。如一個模塊A(A.py)中有個函數getName,另一個模塊不能通過import A.getName將getName導入到本模塊,只能用import A。如果想只導入特定的類、函數、變量則用from A import getName即可。

      嵌套Import

      嵌套import,我分兩種情況,一種是:本模塊導入A模塊(import A),而A中又有import語句,會激活另一個import動作,如import B,而B模塊又可以import其他模塊,一直下去。

      對這種嵌套比較容易理解,注意一點就是各個模塊的Local名字空間是獨立的,所以上面的例子,本模塊import A完了后本模塊只能訪問模塊A,不能訪問B及其他模塊。雖然模塊B已經加載到內存了,如果要訪問還要在明確的在本模塊中import B。

      另外一種嵌套指,在模塊A中import B,而在模塊B中import A。這時會怎么樣呢?這個在Python列表中由RobertChen給出了詳細解釋,抄錄如下:

      [A.py] from B import D class C:pass [B.py] from A import C class D:pass

      為什么執行A的時候不能加載D呢?

      如果將A.py改為:import B就可以了。

      這是怎么回事呢?

      RobertChen:這跟Python內部import的機制是有關的,具體到from B import D,Python內部會分成幾個步驟:

      在sys.modules中查找符號"B"

      果符號B存在,則獲得符號B對應的module對象

      從的__dict__中獲得符號"D"對應的對象,如果"D"不存在,則拋出異常

      如果符號B不存在,則創建一個新的module對象,注意,這時,module對象的__dict__為空。執行B.py中的表達式,填充的__dict__ 。

      從的__dict__中獲得"D"對應的對象,如果"D"不存在,則拋出異常。

    熱帖推薦

    • 成都地址:成都市武侯區科華北路62號力寶大廈N(北樓)18樓
      面授課程:iOS課程培訓、Android課程培訓、HTML5課程培訓、UI課程培訓
    • 北京天豐利校區:北京市海淀區寶盛北里西區28號天豐利商城4層
      北京沙河校區:北京市昌平區沙陽路18號北京科技職業技術廣場服務樓2層、南區服務樓2層
      咨詢電話:400-654-7778 010-82790226-801
      面授課程:iOS培訓、Android培訓、HTML5培訓、UI培訓、PHP培訓、JavaEE培訓、好程序員
    • 深圳科技園校區:深圳市南山區科苑南路高新技術產業園R3-B棟5層
      深圳大學城校區:深圳市南山區留仙大道1201號大學城創客小鎮16棟2樓、3樓
      深圳西部硅谷校區:深圳市寶安區寶安大道5010號西部硅谷B座A605-619
      咨詢電話:0755-86681178/9-801
      面授課程:iOS培訓、Android培訓、HTML5培訓、UI培訓、PHP培訓、JavaEE培訓、好程序員
    • 上海地址:上海市寶山區同濟支路199號智慧七立方3號樓2-4層
      咨詢電話:400-627-7899 021-65025129-602
      面授課程:iOS課程培訓、Android課程培訓、HTML5課程培訓、好程序員
    • 鄭州地址:鄭州市金水區緯五路21號河南教育綜合樓(經緯中學樓)6/7/8層
      咨詢電話:0371-55911950 400-654-7778
      面授課程:iOS課程培訓、Android課程培訓、HTML5課程培訓、UI課程培訓
    • 廣州地址:廣州市天河區元崗路310號智匯park創意園E座5層
      咨詢電話:020-22119207 400-654-7778
      面授課程:iOS課程培訓、Android課程培訓、HTML5課程培訓
    • 大連地址:大連市甘井子區軟件園路2號B8座二樓
      咨詢電話:0411-39026086 400-654-7778
      面授課程:iOS課程培訓、Android課程培訓、HTML5課程培訓
    • 武漢地址:武漢市東新區光谷大道77號金融港B26棟9樓
      咨詢電話:027-59905909 027-59905908 027-59905902
      面授課程:iOS課程培訓、Android課程培訓、HTML5課程培訓
    • 西安南二環校區:西安市二環南路西段60號永安大廈4層
      西安科技園校區:西安市雁塔區高新六路52號立人科技園C座西區4層
      咨詢電話:029-85260160 029-85261030 029-85260960
      面授課程:iOS課程培訓、Android課程培訓、HTML5課程培訓
    • 杭州地址:浙江省杭州市江干區九堡旺田書畫城A座4層
      咨詢電話:0571-86893632 010-82790226-801
      面授課程:iOS課程培訓、Android課程培訓
    • 青島校區地址:青島市市南區金壇路17號青島職業技術南校區實訓樓A4層
      咨詢電話:0532-80910752/3 010-82790226-801
      面授課程:iOS課程培訓、Android課程培訓
    • 掃碼匿名提建議
      直達CEO信箱