欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

我們要做的就是兩件事

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

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

__init__.py

print('包加載成功')

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

import My_package

#輸出
包加載成功

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

__init__.py

print('包加載成功')

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

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

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

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

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

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

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

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

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

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

2、為包增加模塊

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

model1.py

print('這里是model1')

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

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

model2.py

print('這里是model2')

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

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

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

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

下面我們用不同的方式來導(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的第一個函數(shù)
這里是model2的第二個函數(shù)

My_package.fun1('OK')

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

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

我們還可以通過My_package.函數(shù)名的方式來執(zhí)行__init__.py里的函數(shù)(這是因為采用import 包名.模塊名的方式來載入,python依然會執(zhí)行package中的__init__.py,并且生成的對象會被命名為My_package)。

我們可以通過加as的方法來對這一串很長的包名來重新命名,這就是介紹的第二種方法。

方式二: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的第一個函數(shù)
這里是model2的第二個函數(shù)

可以看到我們可以使用new_name1這個變量來代替My_package.model1。這種采用as進行重命名的方式需要注意的是,此時python中將不會出現(xiàn)叫My_package的全局變量來指向這個package了,因此程序會無法找到My_package這個變量。因為python會將最外層的這個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的第一個函數(shù)
這里是model2的第二個函數(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”,這個時候我們可以直接使用model1.函數(shù)名()來調(diào)用函數(shù)了。可以看到跟前一種方式一樣此時python中將不會出現(xiàn)叫My_package的全局變量,雖然已經(jīng)執(zhí)行了__init__.py,但python沒有將My_package賦值給任何變量,因此無法找到My_package。

方法四:from My_package import *

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

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

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

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

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

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

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

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

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

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

3、包的路徑問題

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

大家可以通過運行:

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)上演示的)

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

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

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

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'

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

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

可以看到,包被正常加載了。對于自己寫的模塊我們可以采用這種方式來對其進行加載。

4、相對路徑導(dǎo)入包的問題

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

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

print('這里是model2')

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

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

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

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

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

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

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

相關(guān)文章

  • Python表達式的優(yōu)先級詳解

    Python表達式的優(yōu)先級詳解

    在本篇文章里小編給大家整理了關(guān)于Python表達式的優(yōu)先級的知識點內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • Django的多表查詢操作實戰(zhàn)

    Django的多表查詢操作實戰(zhàn)

    Django提供一種強大而又直觀的方式來"處理"查詢中的關(guān)聯(lián)關(guān)系,它在后臺自動幫你處理JOIN,下面這篇文章主要給大家介紹了關(guān)于Django多表查詢操作的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • Python計數(shù)器collections.Counter用法詳解

    Python計數(shù)器collections.Counter用法詳解

    本文主要介紹了Python計數(shù)器collections.Counter用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • python skimage 連通性區(qū)域檢測方法

    python skimage 連通性區(qū)域檢測方法

    今天小編就為大家分享一篇python skimage 連通性區(qū)域檢測方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Pandas數(shù)據(jù)分析固定時間點和時間差

    Pandas數(shù)據(jù)分析固定時間點和時間差

    這篇文章主要介紹了Pandas數(shù)據(jù)分析固定時間點和時間差,文章未日澳主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 詳解python的字典及相關(guān)操作

    詳解python的字典及相關(guān)操作

    本文主要介紹了python的字典及相關(guān)操作,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 超詳細OpenMV與STM32單片機通信 附完整源碼

    超詳細OpenMV與STM32單片機通信 附完整源碼

    這篇文章主要介紹了OpenMV與STM32單片機通信的相關(guān)知識,在文章結(jié)尾給大家提供了項目源碼,需要的朋友可以參考下
    2021-11-11
  • Python爬取當網(wǎng)書籍數(shù)據(jù)并數(shù)據(jù)可視化展示

    Python爬取當網(wǎng)書籍數(shù)據(jù)并數(shù)據(jù)可視化展示

    這篇文章主要介紹了Python爬取當網(wǎng)書籍數(shù)據(jù)并數(shù)據(jù)可視化展示,下面文章圍繞Python爬蟲的相關(guān)資料展開對爬取當網(wǎng)書籍數(shù)據(jù)的詳細介紹,需要的小伙伴可以參考一下,希望對你有所幫助
    2022-01-01
  • Pycharm如何退出py.test模式

    Pycharm如何退出py.test模式

    這篇文章主要介紹了Pycharm如何退出py.test模式問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • python 利用for循環(huán) 保存多個圖像或者文件的實例

    python 利用for循環(huán) 保存多個圖像或者文件的實例

    今天小編就為大家分享一篇python 利用for循環(huán) 保存多個圖像或者文件的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11

最新評論