最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中創(chuàng)建包和增添包的路徑(sys.path.append())

 更新時(shí)間:2025年01月16日 09:49:45   作者:Python熱愛(ài)者  
本文主要介紹了Python中創(chuàng)建包和增添包的路徑(sys.path.append()),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

python中創(chuàng)建自己的包(package),其實(shí)就只需要里創(chuàng)建一個(gè)文件夾就可以了。文件夾里不是必須要有是__init__.py這個(gè)文件的,不過(guò)如果你的文件夾里存在這個(gè)__init__.py文件,那么當(dāng)你在import這個(gè)包時(shí)python會(huì)立刻執(zhí)行__init__.py里的內(nèi)容并且只會(huì)執(zhí)行__init__.py。相反,如果你的文件夾(這個(gè)package)里沒(méi)有這個(gè)文件,當(dāng)import這個(gè)package時(shí)就不會(huì)做任何事情(換句話說(shuō)你python只會(huì)load這個(gè)包的名稱,但里面接著進(jìn)行任何其他的操作,你可以查看這個(gè)包的默認(rèn)屬性)。因此一般情況下,一個(gè)package中是必須要有__init__.py,并且常常會(huì)在__init__.py文件中執(zhí)行import語(yǔ)句,比如import進(jìn)一些本文件夾里的一些包,或者封裝好一些類,一些函數(shù)。這樣做的好處是,只要你import了這個(gè)package,那么你就可以使用__init__.py中l(wèi)oad的所有包。

1、創(chuàng)造一個(gè)包

我們要做的就是兩件事

  • 在工作目錄下創(chuàng)建一個(gè)文件夾命名為My_package

  • 在文件夾My_package中再創(chuàng)建一個(gè)__init__.py文件

__init__.py

print('包加載成功')

我們可以是在My_package文件夾的同一級(jí)目錄中加載import一下(注意工作目錄要在的同一級(jí)目錄中才能加載到My_package,后面會(huì)介紹如果不在同一級(jí)目錄該怎么做)

import My_package

#輸出
包加載成功

可以看到加載包的時(shí)候(并且在My_package目錄下自動(dòng)生成了一個(gè)__pycache__的文件夾),我們寫在__init__.py中的命令行被執(zhí)行了接下來(lái)我們更加豐富一下__init__.py的內(nèi)容,給這個(gè)里面添加兩個(gè)函數(shù):

__init__.py

print('包加載成功')

def fun1(a):
    print('執(zhí)行函數(shù)1:',a)
    return

def fun2(a):
    print('執(zhí)行函數(shù)2:',a)

接下來(lái)我們導(dǎo)入這個(gè)包,并執(zhí)行里面的函數(shù)。

import My_package
My_package.fun1('開(kāi)始執(zhí)行')
My_package.fun2('開(kāi)始執(zhí)行')

#輸出
包加載成功
執(zhí)行函數(shù)1: 開(kāi)始執(zhí)行
執(zhí)行函數(shù)2: 開(kāi)始執(zhí)行

可以看到這些函數(shù)都已經(jīng)被執(zhí)行了。

當(dāng)然我們可以使用from My_package import *這種方式來(lái)完成上面的內(nèi)容

from My_package import *
fun1('開(kāi)始執(zhí)行')
fun2('開(kāi)始執(zhí)行')

#輸出
包加載成功
執(zhí)行函數(shù)1: 開(kāi)始執(zhí)行
執(zhí)行函數(shù)2: 開(kāi)始執(zhí)行

可以看到結(jié)果是一樣的,由此我們已經(jīng)創(chuàng)建自己的包了

2、為包增加模塊

我們常見(jiàn)的包里面都會(huì)有很多很多其他的.py程序,并不是只有__init__.py,因?yàn)橛行﹥?nèi)容不需要在導(dǎo)入的時(shí)候就執(zhí)行。下面我們?yōu)镸y_package增加兩個(gè)模塊。model1.py和model2.py。

model1.py

print('這里是model1')

def fun1():
    print('這里是model1的第一個(gè)函數(shù)')
    return 

def fun2():
    print('這里是model1的第二個(gè)函數(shù)')
    return

model2.py

print('這里是model2')

def fun1():
    print('這里是model2的第一個(gè)函數(shù)')
    return 

def fun2():
    print('這里是model2的第二個(gè)函數(shù)')
    return

創(chuàng)建完這兩個(gè)模塊之后,我們My_package文件夾下就有四個(gè)文件了:

  • 文件夾__pycache__
  • 文件__init__.py
  • 文件model1.py
  • 文件model2.py

下面我們用不同的方式來(lái)導(dǎo)入包和模塊,并執(zhí)行。

方式一:import My_package.模塊名

import My_package.model1
import My_package.model2

#輸出
包加載成功
這里是model1
這里是model2

My_package.model1.fun1()
My_package.model2.fun2()
#輸出
這里是model1的第一個(gè)函數(shù)
這里是model2的第二個(gè)函數(shù)

My_package.fun1('OK')

#輸出
執(zhí)行函數(shù)1: OK

可以看到__init__.py依然被執(zhí)行了的,而且在導(dǎo)入包的時(shí)候,不同的model中的代碼也在import的時(shí)候執(zhí)行了。需要注意的是,采用這種import 包名.模塊名的方式,會(huì)出現(xiàn)一個(gè)全局變量My_package來(lái)指向這個(gè)包(我們可以通過(guò)dir(My_package)來(lái)查看這個(gè)全局變量的屬性,我們可以看到’fun1’,‘fun2’,‘model1’,'model2’都出現(xiàn)了),因此我們可以采用 包名.模塊名.函數(shù)名 的方式調(diào)用不同model的函數(shù)。

我們還可以通過(guò)My_package.函數(shù)名的方式來(lái)執(zhí)行__init__.py里的函數(shù)(這是因?yàn)椴捎胕mport 包名.模塊名的方式來(lái)載入,python依然會(huì)執(zhí)行package中的__init__.py,并且生成的對(duì)象會(huì)被命名為My_package)。

我們可以通過(guò)加as的方法來(lái)對(duì)這一串很長(zhǎng)的包名來(lái)重新命名,這就是介紹的第二種方法。

方式二:import My_package.model1 as xxx

import My_package.model1 as new_name1
import My_package.model2 as new_name2
#輸出
包加載成功
這里是model1
這里是model2


new_name1.fun1() new_name2.fun2()
#輸出
這里是model1的第一個(gè)函數(shù)
這里是model2的第二個(gè)函數(shù)

可以看到我們可以使用new_name1這個(gè)變量來(lái)代替My_package.model1。這種采用as進(jìn)行重命名的方式需要注意的是,此時(shí)python中將不會(huì)出現(xiàn)叫My_package的全局變量來(lái)指向這個(gè)package了,因此程序會(huì)無(wú)法找到My_package這個(gè)變量。因?yàn)閜ython會(huì)將最外層的這個(gè)model1賦值給new_name1,而不再保存My_package的任何東西,盡管執(zhí)行了My_package__init__.py

方法三:from My_package import model1

from My_package import model1
from My_package import model2
#輸出
包加載成功
這里是model1
這里是model2

model1.fun1()
model2.fun2()
#輸出
這里是model1的第一個(gè)函數(shù)
這里是model2的第二個(gè)函數(shù)

My_package.fun1('OK')
#輸出
NameError: name 'My_package' is not defined
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/tmp/ipykernel_9767/1183774725.py in <module>
      2 from My_package import model2
      3 
----> 4 My_package.fun1('OK')
NameError: name 'My_package' is not defined

根據(jù)導(dǎo)入包的方式顧名思義,“從My_package中導(dǎo)入model1.py”,這個(gè)時(shí)候我們可以直接使用model1.函數(shù)名()來(lái)調(diào)用函數(shù)了。可以看到跟前一種方式一樣此時(shí)python中將不會(huì)出現(xiàn)叫My_package的全局變量,雖然已經(jīng)執(zhí)行了__init__.py,但python沒(méi)有將My_package賦值給任何變量,因此無(wú)法找到My_package。

方法四:from My_package import *

from My_package import *
fun1('OK')
#輸出
包加載成功
執(zhí)行函數(shù)1: OK

modle1.fun1()
#輸出
NameError: name 'modle1' is not defined

這種方式加載其實(shí)就相當(dāng)于直接把__init__.py直接加載到工作區(qū),直接可以使用__init__.py中的類或者函數(shù),不用再添加My_package.函數(shù)名。不過(guò)要注意的是這種導(dǎo)入,只導(dǎo)入了My_package中__init__.py,并沒(méi)有導(dǎo)入其他的model1,或者model2,因此第三行是會(huì)報(bào)錯(cuò)的(并且我們可以看到并沒(méi)有任何model的打印出現(xiàn),其實(shí)這也側(cè)面說(shuō)明了當(dāng)只采用import package的方式導(dǎo)入包時(shí),python只會(huì)執(zhí)行__init__.py)。

我們又該怎么調(diào)用model里的函數(shù)呢?用下面的方式就可以了。

from My_package.model1 import *
#輸出
包加載成功
這里是model1

fun1()
fun2()
#輸出
這里是model1的第一個(gè)函數(shù)
這里是model1的第二個(gè)函數(shù)

其實(shí)不推薦大家采用這這種方法,因?yàn)槿绻诓煌琺odel中出現(xiàn)了相同的函數(shù)名方法,后導(dǎo)入的包將會(huì)把前者的函數(shù)名給掩蓋。比如本文的這兩個(gè)例子,model1和modle2的函數(shù)都叫做fun1,fun2,那如果我們按照這個(gè)方式同時(shí)導(dǎo)入這兩個(gè)模塊,會(huì)出現(xiàn)什么問(wèn)題呢?

from My_package.model1 import *
from My_package.model2 import *
#輸出
包加載成功
這里是model1
這里是model2

fun1()
fun2()
#輸出
這里是model2的第一個(gè)函數(shù)
這里是model2的第二個(gè)函數(shù)

大家可以看到前兩句執(zhí)行之后,顯示兩個(gè)包都被導(dǎo)入了,但是我們執(zhí)行fun1和fun2時(shí)編譯器識(shí)別的是后導(dǎo)入的模塊model2的fun1和fun2,而model2的函數(shù)被掩蓋了,因此不推薦大家采用方法4作為導(dǎo)入包的方法。

3、包的路徑問(wèn)題

剛學(xué)python的時(shí)候我非常好奇,import的包到底在那里?我pip install xxx下載下來(lái)的包又在那里?(當(dāng)然可以通過(guò)路徑查找),為什么下載下來(lái)的包在不同的地方但是import卻能找到這些散落到各地的包?其實(shí)這些問(wèn)題都?xì)w結(jié)到import是如何導(dǎo)入到包的。其實(shí)import包的時(shí)候時(shí),python會(huì)在一些路徑中搜索是否存在名字相符的文件夾(package)或者.py文件。

大家可以通過(guò)運(yùn)行:

import sys
sys.path
#輸出
['/home/g4/.vscode/extensions/ms-toolsai.jupyter-2021.3.684299474/pythonFiles/vscode_datascience_helpers/../.does-not-exist',
 '/home/g4/.vscode/extensions/ms-toolsai.jupyter-2021.3.684299474/pythonFiles',
 '/home/g4/.vscode/extensions/ms-toolsai.jupyter-2021.3.684299474/pythonFiles/lib/python',...]

(在ubuntu系統(tǒng)上演示的)

查看的當(dāng)前的系統(tǒng)環(huán)境環(huán)境變量(sys.path是一個(gè)列表,每個(gè)元素是路徑),在import的時(shí)候python就會(huì)在這些路徑中去尋找有沒(méi)有符合的名字,如果沒(méi)有找到,就會(huì)返回我們最常見(jiàn)的"ModuleNotFoundError: No module named ‘kae’".

通過(guò)這個(gè)問(wèn)題的討論其實(shí)我們可以知道,如果我們自己編寫的包想要被import到,就需要把包的路徑寫道環(huán)境變量中(前文演示的時(shí)候工作目錄是會(huì)自動(dòng)加入到import的查詢范圍內(nèi)的)。我們不用去修改電腦的環(huán)境變量,因?yàn)閯傉f(shuō)道sys.path是一個(gè)列表,因此我們可以通過(guò)append方法加入我們包所在路徑可以了。

為了演示,我把前面寫好的My_package文件夾放到了工作目錄的下一級(jí)目錄。

import  My_package
#輸出
ModuleNotFoundError: No module named 'My_pacackge'
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
/tmp/ipykernel_31481/1446587236.py in <module>
----> 1 import  My_pacackge
ModuleNotFoundError: No module named 'My_pacackge'

不出意外的,報(bào)錯(cuò)了。接下來(lái)我們添加My_package文件夾的目錄到系統(tǒng)目錄中

import sys
sys.path.append('/home/g4/桌面/project')
print('##############')
import My_package
#輸出
##############
包加載成功

可以看到,包被正常加載了。對(duì)于自己寫的模塊我們可以采用這種方式來(lái)對(duì)其進(jìn)行加載。

4、相對(duì)路徑導(dǎo)入包的問(wèn)題

為了更好區(qū)分,我們將model2.py中的兩個(gè)函數(shù)改一下名字。

#學(xué)習(xí)中遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流群:531509025

print('這里是model2')

def model2_fun1():
    print('這里是model2的第一個(gè)函數(shù)')
    return 

def model2_fun1fun2():
    print('這里是model2的第二個(gè)函數(shù)')
    return

在同一個(gè)package中,如果model1.py中想使用model2.py的函數(shù),那我們可以通過(guò)import My_package.model2的方式進(jìn)行正常導(dǎo)入。不過(guò)會(huì)有個(gè)問(wèn)題,如果某一天,我把文件夾My_package更名了,那么此時(shí)mode1.py中的import My_package.model2將會(huì)報(bào)錯(cuò)。如何避免這個(gè)問(wèn)題呢,我們就可以采用相對(duì)路徑的方式導(dǎo)入包。即將import My_package.model2改為import .model2的方式導(dǎo)入。

那么無(wú)論文件夾My_package如何更名,只要model1.py與model2.py是在同一個(gè)package下的,那么這行代碼都會(huì)正確找到。

接下來(lái)我們要說(shuō)一下原理:python相對(duì)路徑導(dǎo)入包的方法其本質(zhì)是,都是先找到絕對(duì)路徑再import。他會(huì)根據(jù)model1的__package__變量去找到model1的package是誰(shuí)(本例中就是My_package),再將import .model2復(fù)原成import My_package.model2,從而完成導(dǎo)入。

明白這個(gè)原理之后,相信大家就會(huì)知道,為什么我直接運(yùn)行model1.py時(shí),其中的import .model2會(huì)報(bào)錯(cuò)了。因?yàn)楫?dāng)你直接運(yùn)行model1.py的時(shí)候,這個(gè)文件將會(huì)當(dāng)作main package 加載到內(nèi)存中,此時(shí)它并不屬于任何的的package,所以import .model2就不會(huì)轉(zhuǎn)化成import My_package.model2,也就無(wú)法找到正確的model2,從而報(bào)錯(cuò)。

到此這篇關(guān)于Python中創(chuàng)建包和增添包的路徑(sys.path.append())的文章就介紹到這了,更多相關(guān)Python創(chuàng)建包和增添包路徑內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決pandas .to_excel不覆蓋已有sheet的問(wèn)題

    解決pandas .to_excel不覆蓋已有sheet的問(wèn)題

    今天小編就為大家分享一篇解決pandas .to_excel不覆蓋已有sheet的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • 在OpenCV里使用特征匹配和單映射變換的代碼詳解

    在OpenCV里使用特征匹配和單映射變換的代碼詳解

    這篇文章主要介紹了在OpenCV里使用特征匹配和單映射變換的方法,本文通過(guò)圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 教你輕松解決selenium打開(kāi)瀏覽器自動(dòng)退出

    教你輕松解決selenium打開(kāi)瀏覽器自動(dòng)退出

    這篇文章主要給大家介紹了關(guān)于如何輕松解決selenium打開(kāi)瀏覽器自動(dòng)退出的相關(guān)資料,Selenium是一個(gè)用于Web應(yīng)用程序測(cè)試的工具,Selenium測(cè)試直接運(yùn)行在瀏覽器中,今天在打開(kāi)網(wǎng)頁(yè)時(shí),瀏覽器總是一閃而退,需要的朋友可以參考下
    2023-08-08
  • 使用python更改Word文檔字體的操作代碼

    使用python更改Word文檔字體的操作代碼

    更改文字字體是編輯和美化Word文檔時(shí)的一項(xiàng)常見(jiàn)需求,使用合適的字體不僅可以提升文檔的整體視覺(jué)效果,還能突顯關(guān)鍵信息,本文將介紹如何通過(guò)Python代碼更改Word文檔字體,實(shí)現(xiàn)批量操作與自動(dòng)化,需要的朋友可以參考下
    2024-08-08
  • Python Django Cookie 簡(jiǎn)單用法解析

    Python Django Cookie 簡(jiǎn)單用法解析

    這篇文章主要介紹了Python Django Cookie 簡(jiǎn)單用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python使用subprocess模塊輕松調(diào)用外部程序與命令

    Python使用subprocess模塊輕松調(diào)用外部程序與命令

    subprocess是Python的標(biāo)準(zhǔn)庫(kù),它的設(shè)計(jì)目標(biāo)是替代舊有的os.system、os.popen等模塊,提供更統(tǒng)一、更強(qiáng)大的子進(jìn)程管理功能,所以本文給大家介紹了Python如何使用subprocess模塊輕松調(diào)用外部程序與命令,需要的朋友可以參考下
    2026-04-04
  • kali中python版本的切換方法

    kali中python版本的切換方法

    今天小編就為大家分享一篇kali中python版本的切換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • 淺談Pycharm調(diào)用同級(jí)目錄下的py腳本bug

    淺談Pycharm調(diào)用同級(jí)目錄下的py腳本bug

    今天小編就為大家分享一篇淺談Pycharm調(diào)用同級(jí)目錄下的py腳本bug,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • django 信號(hào)調(diào)度機(jī)制詳解

    django 信號(hào)調(diào)度機(jī)制詳解

    這篇文章主要介紹了django 信號(hào)調(diào)度機(jī)制詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • python自動(dòng)導(dǎo)入包的實(shí)現(xiàn)

    python自動(dòng)導(dǎo)入包的實(shí)現(xiàn)

    本文主要介紹了python自動(dòng)導(dǎo)入包的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評(píng)論

孟州市| 南靖县| 寻甸| 西昌市| 如东县| 紫阳县| 孝义市| 荔波县| 亚东县| 全椒县| 武胜县| 英超| 麻城市| 利川市| 治多县| 会理县| 彩票| 昌都县| 镶黄旗| 龙泉市| 松潘县| 称多县| 赤城县| 安吉县| 潮州市| 北川| 兰西县| 怀宁县| 万安县| 邹平县| 桂阳县| 叶城县| 临城县| 密云县| 宁海县| 锡林郭勒盟| 无锡市| 鹿泉市| 民和| 无为县| 保亭|