99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀在Python中添加自定義模塊_python導(dǎo)入自定義模塊
在Python中添加自定義模塊_python導(dǎo)入自定義模塊
2017-01-04
收藏

在Python中添加自定義模塊_python導(dǎo)入自定義模塊

一般來(lái)說(shuō),我們會(huì)將自己寫的python模塊與python自帶的模塊分開存放以達(dá)到便于維護(hù)的目的。

Python 運(yùn)行環(huán)境在查找?guī)煳募r(shí)是對(duì) sys.path 列表進(jìn)行遍歷,如果我們想在運(yùn)行環(huán)境中注冊(cè)新的類庫(kù),主要有以下三種方法:


在sys.path列表中添加新的路徑。

設(shè)置PYTHONPATH環(huán)境變量。

將庫(kù)文件復(fù)制到sys.path列表中的目錄里(如site-packages目錄)。

其實(shí),最簡(jiǎn)單的辦法是用 .pth 文件來(lái)實(shí)現(xiàn)。Python 在遍歷已知的庫(kù)文件目錄過(guò)程中,如果見到一個(gè) .pth 文件,就會(huì)將文件中所記錄的路徑加入到 sys.path 設(shè)置中,這樣 .pth 文件說(shuō)指明的庫(kù)也就可以被 Python 運(yùn)行環(huán)境找到。

操作:

在Python/Lib/site-package目錄下創(chuàng)建一個(gè)MyModule.pth文件,其中內(nèi)容為自定義的模塊所在的路徑。

Config代碼

C:\Project

C:\Project 這樣Project目錄下的python文件就可以被找到了。

本篇文章來(lái)源于 Linux公社網(wǎng)站(www.linuxidc.com)  原文鏈接:http://www.linuxidc.com/Linux/2011-07/38078.htm


******************************************************************************************************************************************

最近在看《Python源碼剖析》,對(duì)Python內(nèi)部運(yùn)行機(jī)制比以前了解的更深入了,感覺自己有機(jī)會(huì)也可以做個(gè)小型的動(dòng)態(tài)腳本語(yǔ)言了,呵呵,當(dāng)然是吹牛了。目的當(dāng)然不是創(chuàng)造一個(gè)動(dòng)態(tài)語(yǔ)言,目的只有一個(gè):更好的使用Python。看到模塊導(dǎo)入那塊的時(shí)候,終于對(duì)模塊導(dǎo)入機(jī)制比較了解了,以防忘記特記錄下來(lái)。

模塊的搜索路徑

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

1、sys.path第一個(gè)路徑往往是主模塊所在的目錄。在交互環(huán)境下添加一個(gè)空項(xiàng),它對(duì)應(yīng)當(dāng)前目錄。

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

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

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

如果我們沒(méi)有找到Python Home,則把注冊(cè)表Software/Python/PythonCore/2.5/PythonPath的項(xiàng)加入sys.path(HKLM和 HKCU合并后加入),但相關(guān)的子目錄不會(huì)自動(dòng)添加的。

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

總結(jié)如下

當(dāng)在安裝好的主目錄中運(yùn)行Python.exe時(shí),首先推斷Python Home,如果找到了PythonHome,注冊(cè)表中的PythonPath將被忽略;否則將注冊(cè)表的PythonPath加入。

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

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

如果Python.exe不能發(fā)現(xiàn)他的主目錄(PythonHome),并且注冊(cè)表也沒(méi)有PythonPath,則將加入缺省的相對(duì)目錄。

標(biāo)準(zhǔn)Import

Python中所有加載到內(nèi)存的模塊都放在sys.modules。當(dāng)import一個(gè)模塊時(shí)首先會(huì)在這個(gè)列表中查找是否已經(jīng)加載了此模塊,如果加載了則只是將模塊的名字加入到正在調(diào)用import的模塊的Local名字空間中。如果沒(méi)有加載則從sys.path目錄中按照模塊名稱查找模塊文件,模塊文件可以是py、pyc、pyd,找到后將模塊載入內(nèi)存,并加入到sys.modules中,并將名稱導(dǎo)入到當(dāng)前的Local名字空間。

可以看出了,一個(gè)模塊不會(huì)重復(fù)載入。多個(gè)不同的模塊都可以用import引入同一個(gè)模塊到自己的Local名字空間,其實(shí)背后的PyModuleObject對(duì)象只有一個(gè)。

說(shuō)一個(gè)容易忽略的問(wèn)題,import只能導(dǎo)入模塊,不能導(dǎo)入模塊中的對(duì)象(類、函數(shù)、變量等)。如一個(gè)模塊A(A.py)中有個(gè)函數(shù)getName,另一個(gè)模塊不能通過(guò)import A.getName將getName導(dǎo)入到本模塊,只能用import A。如果想只導(dǎo)入特定的類、函數(shù)、變量則用from A import getName即可。

嵌套Import

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

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

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

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

為什么執(zhí)行A的時(shí)候不能加載D呢?

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

這是怎么回事呢?

RobertChen:這跟Python內(nèi)部import的機(jī)制是有關(guān)的,具體到from B import D,Python內(nèi)部會(huì)分成幾個(gè)步驟:

  1. 在sys.modules中查找符號(hào)”B”
  2. 果符號(hào)B存在,則獲得符號(hào)B對(duì)應(yīng)的module對(duì)象<module B>。從<module B>的__dict__中獲得符號(hào)”D”對(duì)應(yīng)的對(duì)象,如果”D”不存在,則拋出異常
  3. 如果符號(hào)B不存在,則創(chuàng)建一個(gè)新的module對(duì)象<module B>,注意,這時(shí),module對(duì)象的__dict__為空。

    執(zhí)行B.py中的表達(dá)式,填充<module B>的__dict__ 。

    從<module B>的__dict__中獲得”D”對(duì)應(yīng)的對(duì)象,如果”D”不存在,則拋出異常。

所以,這個(gè)例子的執(zhí)行順序如下:

1、執(zhí)行A.py中的from B import D

由于是執(zhí)行的python A.py,所以在sys.modules中并沒(méi)有<module B>存在,首先為B.py創(chuàng)建一個(gè)module對(duì)象(<module B>),注意,這時(shí)創(chuàng)建的這個(gè)module對(duì)象是空的,里邊啥也沒(méi)有,在Python內(nèi)部創(chuàng)建了這個(gè)module對(duì)象之后,就會(huì)解析執(zhí)行B.py,其目的是填充<module B>這個(gè)dict。

2、執(zhí)行B.py中的from A import C

在執(zhí)行B.py的過(guò)程中,會(huì)碰到這一句,首先檢查sys.modules這個(gè)module緩存中是否已經(jīng)存在<module A>了,由于這時(shí)緩存還沒(méi)有緩存<module A>,所以類似的,Python內(nèi)部會(huì)為A.py創(chuàng)建一個(gè)module對(duì)象(<module A>),然后,同樣地,執(zhí)行A.py中的語(yǔ)句。

3、再次執(zhí)行A.py中的from B import D

這時(shí),由于在第1步時(shí),創(chuàng)建的<module B>對(duì)象已經(jīng)緩存在了sys.modules中,所以直接就得到了<module B>,但是,注意,從整個(gè)過(guò)程來(lái)看,我們知道,這時(shí)<module B>還是一個(gè)空的對(duì)象,里面啥也沒(méi)有,所以從這個(gè)module中獲得符號(hào)”D”的操作就會(huì)拋出異常。如果這里只是import B,由于”B”這個(gè)符號(hào)在sys.modules中已經(jīng)存在,所以是不會(huì)拋出異常的。

上面的解釋已經(jīng)由Zoom.Quiet收錄在啄木鳥了,里面有圖,可以參考一下。

Package(包) Import

包(Package)可以看成模塊的集合,只要一個(gè)文件夾下面有個(gè)__init__.py文件,那么這個(gè)文件夾就可以看做是一個(gè)包。包下面的文件夾還可以成為包(子包)。更進(jìn)一步,多個(gè)較小的包可以聚合成一個(gè)較大的包,通過(guò)包這種結(jié)構(gòu),方便了類的管理和維護(hù),也方便了用戶的使用。比如SQLAlchemy等都是以包的形式發(fā)布給用戶的。

包和模塊其實(shí)是很類似的東西,如果查看包的類型import SQLAlchemy type(SQLAlchemy),可以看到其實(shí)也是<type ‘module’>。import包的時(shí)候查找的路徑也是sys.path。

包導(dǎo)入的過(guò)程和模塊的基本一致,只是導(dǎo)入包的時(shí)候會(huì)執(zhí)行此包目錄下的__init__.py而不是模塊里面的語(yǔ)句了。另外,如果只是單純的導(dǎo)入包,而包的__init__.py中又沒(méi)有明確的其他初始化操作,那么此包下面的模塊是不會(huì)自動(dòng)導(dǎo)入的。如:

PA

–__init__.py

–wave.py

–PB1

–__init__.py

–pb1_m.py

–PB2

–__init__.py

–pb2_m.py

__init__.py都為空,如果有以下程序:

  1. import sys
  2. import PA.wave
    #1
  3. import PA.PB1 #2
  4. import PA.PB1.pb1_m as m1
    #3

  5. import PA.PB2.pb2_m
    #4

  6. PA.wave.getName() #5

  7. m1.getName() #6

  8. PA.PB2.pb2_m.getName() #7

當(dāng)執(zhí)行#1后,sys.modules會(huì)同時(shí)存在PA、PA.wave兩個(gè)模塊,此時(shí)可以調(diào)用PA.wave的任何類或函數(shù)了。但不能調(diào)用PA.PB1(2)下的任何模塊。當(dāng)前Local中有了PA名字。

當(dāng)執(zhí)行#2后,只是將PA.PB1載入內(nèi)存,sys.modules中會(huì)有PA、PA.wave、PA.PB1三個(gè)模塊,但是PA.PB1下的任何模塊都沒(méi)有自動(dòng)載入內(nèi)存,此時(shí)如果直接執(zhí)行PA.PB1.pb1_m.getName()則會(huì)出錯(cuò),因?yàn)镻A.PB1中并沒(méi)有pb1_m。當(dāng)前Local中還是只有PA名字,并沒(méi)有PA.PB1名字。

當(dāng)執(zhí)行#3后,會(huì)將PA.PB1下的pb1_m載入內(nèi)存,sys.modules中會(huì)有PA、PA.wave、PA.PB1、PA.PB1.pb1_m四個(gè)模塊,此時(shí)可以執(zhí)行PA.PB1.pb1_m.getName()了。由于使用了as,當(dāng)前Local中除了PA名字,另外添加了m1作為PA.PB1.pb1_m的別名。

當(dāng)執(zhí)行#4后,會(huì)將PA.PB2、PA.PB2.pb2_m載入內(nèi)存,sys.modules中會(huì)有PA、PA.wave、PA.PB1、PA.PB1.pb1_m、PA.PB2、PA.PB2.pb2_m六個(gè)模塊。當(dāng)前Local中還是只有PA、m1。數(shù)據(jù)分析培訓(xùn)

下面的#5,#6,#7都是可以正確運(yùn)行的。

注意的是:如果PA.PB2.pb2_m想導(dǎo)入PA.PB1.pb1_m、PA.wave是可以直接成功的。最好是采用明確的導(dǎo)入路徑,對(duì)于./..相對(duì)導(dǎo)入路徑還是不推薦用。


數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }