Python模塊和包的管理

目錄

  • 模塊和包
  • 導入包的幾種方式
  • 包內(nèi)引用
  • 自定義init.py
  • 添加本地的包到項目中

模塊和包

首先钳榨,先介紹兩個概念:

  • 模塊:一個python文件(xxx.py)就是一個模塊轿曙。我們可以在一個模塊里定義變量涡拘、方法艳狐、類
  • 包:模塊通過包來組織和管理。從實現(xiàn)的方式來看毫捣,包是一個包含init.py的文件夾

導入包的幾種方式

- import item.subitem.subsubitem
- from package import item (推薦使用的方式)
- from package import *

現(xiàn)在假設我們有下面的文件結(jié)構(gòu)锋谐,michasel.py遍尺、james.py和amanda.py的代碼是類似的,除了name的值不一樣:

# 文件結(jié)構(gòu)
school
   boys 
       michael.py
       james.py
       __init__.py
   girls
       amanda.py
       __init__.py
   __init__.py
   
# michael.py 示例代碼
name = 'Michael'

def say_hello():
    print('hi, this is %s.' % (name, ))

class Info(object):
    def __init__(self):
        pass

    def info(self):
        say_hello()

默認情況下涮拗,我們不需要在init.py下添加任何代碼就可以使用上述的前兩種方式導入乾戏。

  • import item.subitem.subsubitem:使用這種方法瞎疼,可以導入包或者模塊怔檩,但是不能導入一個模塊中定義的內(nèi)容,比如模塊中的類则北,方法或者變量等就漾。并且引用包中的內(nèi)容的時候呐能,必須使用完整的名字(這里就是item.subitem.subsubitem)。一般使用這種方式的時候从藤,我們可以給導入的包或者模塊起別名催跪,這樣就可以避免使用很長的完整名。

import school.boys.michael
school.boys.michael.say_hello()
michael.say_hello() # NameError: name 'michael' is not defined

# 取別名
import school.boys.james as james
james.say_hello()


  • from package import item:從字面理解夷野,就是從某個包中導入子包或者模塊懊蒸。除此之外,還可以導入某個模塊中定義的類悯搔,方法或者變量等骑丸。同時,與上面那種方法相比妒貌,這種方法可以通過import后面的名字直接使用(而不需要使用完整名)通危。

from school.boys import james
james.say_hello()

from school.boys.michael import name
print(name)

  • from package import *:執(zhí)行from package import * 的時候,如果init.py中定義了all列表灌曙,則會把列表中列出的模塊全部導入菊碟。如果沒有定義all列表,那么就不支持import *在刺;如果定義了all卻沒有賦值逆害,那么import *不會導入任何模塊。

# 沒有定義__all__
from school.boys import *
james.say_hello() # NameError: name 'james' is not defined

# 設置__all__ = __all__ = ['james', 'michael']
from school.boys import *
james.say_hello() # Correct 
michael.say_hello() # Correct

# 設置__all__ = [](空列表)
from school.boys import *
james.say_hello() # NameError: name 'james' is not defined

包內(nèi)引用

一個模塊可以導入本包內(nèi)的模塊蚣驼,也可以從鄰包導入魄幕。導入的時候,可以使用相對位置或者絕對位置導入颖杏。需要注意的是纯陨,在主模塊中導入不論本包或者鄰包的模塊的時候,總是要使用絕對位置留储,下面通過具體的示例來說明翼抠。

############## 引用相同包中的模塊 ##############
# 在james.py中引用michael.py中定義的name
# 使用相對位置
from .michael import name as michael_name
print(michael_name)

# 使用絕對位置
from school.boys.michael import name as michael_name
################################################


############## 引用鄰包中的模塊 ################
# 在james.py中引用amanda.py中定義的name
# 使用相對位置
from ..girls.amanda import name as amanda_name
print(amanda_name)

# 使用絕對位置
from school.girls.amanda import name as amanda_name
################################################


############## 主模塊(例如把james.py作為主模塊來運行)中,必須使用絕對位置 ##############
# 例如获讳,在james.py中以相對位置導入michael.py机久,并且把james.py作為主模塊運行,會出現(xiàn)一下錯誤
# ModuleNotFoundError: No module named '__main__.michael'; '__main__' is not a package
from .michael import name as michael_name
print(michael_name)
#####################################################################################

自定義init.py

  • 自動加載子模塊 - 還是以本文開始的文件結(jié)構(gòu)為例∨夂浚現(xiàn)在膘盖,我們想在導入school.boys包的時候,自動就導入james.py和michael.py這兩個模塊尤误。只需要在boys下的init.py中添加下面的代碼
# school/boys/__init__.py
from . import james
from . import michael

# 在主模塊中導入
import school.boys
school.boys.michael.say_hello()

  • 合并子模塊為單一的邏輯模塊 - 例如james.py下有james_greeting方法侠畔,michael.py下有michael_greeting方法,希望在主模塊中調(diào)用的時候损晤,看起來這兩個方法屬于同一個模塊软棺,比如屬于boys這個包,這樣就不需要導入michael.py尤勋、james.py
# school/boys/__init__.py
from .james import james_greeting
from .michael import michael_greeting

# 在主模塊中導入
import school.boys
school.boys.michael_greeting()
school.boys.james_greeting()

  • 包命名空間 - 文章一開始的部分就提到喘落,我們可以在一個模塊中導入一個包茵宪,一個包下面包含init.py文件。如果你好奇瘦棋,或許你已經(jīng)試過了 - 如果我們刪除了包下面的init.py稀火,我們依然可以在模塊中導入這個包,這個神奇的魔法是通過“包命名空間”實現(xiàn)赌朋。當一個文件夾下不包含init.py的時候凰狞,那么解釋器將把這個文件夾理解為包命名空間。這種用法沛慢,可能會用在一些開發(fā)框架中赡若,對于框架的使用者而言,可以創(chuàng)建相同名稱的文件夾并創(chuàng)建自己的模塊团甲,相當于把自己的模塊整合到該開發(fā)框架中逾冬。我們可以輸出某個包的str,通過判斷是否包含"namespace"來判斷是否是包命名空間躺苦。

import school.boys
print(school.boys.__path__)
print(school.boys)

# output

# 包
['D:\\Workspace\\Python\\PackageDemo\\school\\boys']
<module 'school.boys' from 'D:\\Workspace\\Python\\PackageDemo\\school\\boys\\__init__.py'>

# 包命名空間
_NamespacePath(['D:\\Workspace\\Python\\PackageDemo\\school\\boys'])
<module 'school.boys' (namespace)>

添加本地的包到項目中

有一種情況是粉渠,在公司的項目中,我們需要使用到一些自家的通用的包圾另,這個包無法通過網(wǎng)絡獲取霸株,但是在我們的開發(fā)環(huán)境中可以找到,那在我們開發(fā)的項目中集乔,如何去導入呢去件?一種簡單粗暴的方法是,將包所在的路徑添加的系統(tǒng)變量PATHONPATH中(其實還可以pip install --user packagename 來安裝私有包)扰路;另一個種是我們在項目中尤溜,修改sys.path,這樣去告訴解釋器去哪里找這個包汗唱。例如宫莱,現(xiàn)在我們把這個自家是包復制到項目是packages目錄中:


import sys
from os.path import abspath, join, dirname
sys.path.insert(0, join(abspath(dirname(__file__)), 'src'))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市哩罪,隨后出現(xiàn)的幾起案子授霸,更是在濱河造成了極大的恐慌,老刑警劉巖际插,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碘耳,死亡現(xiàn)場離奇詭異,居然都是意外死亡框弛,警方通過查閱死者的電腦和手機辛辨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斗搞,你說我怎么就攤上這事指攒。” “怎么了僻焚?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵允悦,是天一觀的道長。 經(jīng)常有香客問我溅呢,道長,這世上最難降的妖魔是什么猿挚? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任咐旧,我火速辦了婚禮,結(jié)果婚禮上绩蜻,老公的妹妹穿的比我還像新娘铣墨。我一直安慰自己,他們只是感情好办绝,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布伊约。 她就那樣靜靜地躺著,像睡著了一般孕蝉。 火紅的嫁衣襯著肌膚如雪屡律。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天降淮,我揣著相機與錄音超埋,去河邊找鬼。 笑死佳鳖,一個胖子當著我的面吹牛霍殴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播系吩,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼来庭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了穿挨?” 一聲冷哼從身側(cè)響起月弛,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎科盛,沒想到半個月后尊搬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡土涝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年佛寿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡冀泻,死狀恐怖常侣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弹渔,我是刑警寧澤胳施,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站肢专,受9級特大地震影響舞肆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜博杖,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一椿胯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剃根,春花似錦哩盲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苗傅,卻和暖如春抒线,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渣慕。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工十兢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摇庙。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓旱物,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卫袒。 傳聞我的和親對象是個殘疾皇子宵呛,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 在Python中有一個概念叫做模塊(module),這個和C語言中的頭文件以及Java中的包很類似夕凝,比如在Pyth...
    一只寫程序的猿閱讀 3,980評論 0 3
  • 模塊 一個模塊就是包含了python定義和聲明的文件宝穗,文件名就是模塊名字加上.py后綴,通過導入模塊來引入其他文件...
    斷尾壁虎V閱讀 1,592評論 0 1
  • 類 類的概念在許多語言中出現(xiàn)转砖,很容易理解须鼎。它將數(shù)據(jù)和操作進行封裝鲸伴,以便將來的復用。 模塊 模塊晋控,在Python可理...
    隨風化作雨閱讀 1,892評論 0 5
  • 1.1Python中的模塊介紹和使用 有過C語言編程經(jīng)驗的朋友都知道在C語言中如果要引用sqrt函數(shù)汞窗,必須用語句#...
    TENG書閱讀 412評論 0 0
  • [2] 恩惠與平安 腓立比書一章2節(jié)【腓1:2】愿恩惠、平安從神我們的父并主耶穌基督歸與你們赡译! 原文精要 恩惠:(...
    術(shù)兵閱讀 3,658評論 0 0