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

Python包模塊與模塊導入查找順序詳解

 更新時間:2025年09月02日 09:53:38   作者:trayvontang  
Python模塊是.py文件,包含__init__.py,導入查找順序為sys模塊緩存、當前目錄、PYTHONPATH、Lib、site-packages,命名空間分local、global、built-in,文件類型包括.pyc、.pyd、.dll等,用于存儲編譯結(jié)果

簡介

無論是為了看懂別人的代碼,還是為了更好的組織我們的個人的工程代碼,了解一下Python的模塊和包都非常有必要。

另外,知道搜索模塊的順序,也能幫助我們更好的理解一些常見的錯誤,方便我們快速定位問題。

模塊導入查找順序

首先,我們先看一下Python的模塊查找順序:

  1. sys.modules查找(導入模塊緩存)
  2. 執(zhí)行腳本所在的目錄:__name__==‘__main__’
  3. 環(huán)境變量PYTHONPATH指定的目錄
  4. 標準庫目錄(Python安裝跟目錄下的Lib目錄)
  5. 配置文件(Python安裝跟目錄下.pth文件中指定的目錄)
  6. 三方庫(Python安裝跟目錄下site-packages中的目錄)

搜索路徑是由sys.path決定,我們可以打印看一下:

import sys

print(sys.path)

輸出:

['E:\\app\\python\\fin\\md', 'E:\\app\\python\\fin', 'E:\\app\\python\\fin\\.venv\\Scripts\\python313.zip', 'D:\\Env\\python\\py3130i\\DLLs', 'D:\\Env\\python\\py3130i\\Lib', 'D:\\Env\\python\\py3130i', 'E:\\app\\python\\fin\\.venv', 'E:\\app\\python\\fin\\.venv\\Lib\\site-packages']

我們可以手動添加搜索目錄和順序:

import sys

# 添加在末尾,最后查找
sys.path.append('dir')
# 添加在開頭,最先查找
sys.path.insert(0, 'dir2')

# 支持zip
sys.path.append('module.zip')
# 支持zip中指定目錄
sys.path.append('module.zip/lib/python')

模塊查找

入口文件所在目錄

環(huán)境變量PYTHONPATH

  • Linux系統(tǒng):
echo 'export PYTHONPATH="/home/tim/pylib/"' >> ~/.bashrc
source ~/.bashrc

  • Windows:

Lib目錄(標準庫)

.pth配置文件

注意._pth和.pth的區(qū)別

._pth:安裝包中沒有這個文件要自己創(chuàng)建,內(nèi)嵌包中有

內(nèi)容如下:

python311.zip
.
D:\\Env\\python\\py3114\\Lib\\site-packages\\
# Uncomment to run site.main() automatically
#import site

._pth會覆蓋sys.path

而.pth是添加sys.path

.pth的處理邏輯在標準庫site中:

新版本的.pth文件有很多限制,可以參考:site

注意:

這個文件名字必須要對,不知道,可以直接復制安裝目錄上的PythonXXX.dll這個文件的名字。

另外,一般不需要修改,因為這個文件會覆蓋sys.path,讓其他的都失效。

三方庫

標準庫Lib下的site-packages目錄

模塊

Python中的模塊就是指py文件,一個文件代表一個模塊。

很多時候,一個工程不止一個模塊,我們可以用包來組織不同模塊。

包中包含一個__init__.py文件,用來控制包的導入行為。

在2.x中__init__.py文件是必修有,3.x可選。

import

import 模塊名

Python解釋器第1次導入模塊就加載到內(nèi)存,多次import不會重新執(zhí)行模塊內(nèi)的語句

我們看一個示例:

我們有一個base_module.py文件

print('這是一個自定義基本模塊')

num = 1000


def fun_a():
    print('fun_a', num)


def fun_b():
    print('fun_b')

if __name__=='__main__':
    print('執(zhí)行了該文件')

我們在module_import_test.py文件中導入base_module模塊(文件)

import sys

print(sys.modules)

import base_module

# 多了base_module模塊信息
print(sys.modules)
base_module.fun_a()

import base_module
print(sys.modules)

base_module.fun_a()

注意:文件名字不要用中劃線,否則import模塊會出錯。

我們可以看到?jīng)]有打?。簣?zhí)行了該文件,這是因為我們導入的是模塊,沒有直接執(zhí)行這個文件。

現(xiàn)在是不是就更清楚為啥要加上:if name==‘main’:了

if __name__=='__main__':
    print('執(zhí)行了該文件')

from mmm import fffvvv

從包或者模塊中導入函數(shù)、變量等。

和直接import模塊不同,from方式相當于將模塊指定的元素導入到當前命名空間。

因此,我們可以直接調(diào)用方法,不用通過模塊名.xxx的方式調(diào)用了。

from base_module import fun_a,fun_b

fun_a()
fun_b()

from mmm import fff as new_name

還可以用as重命名:

from base_module import fun_a as xxx

xxx()

form mmm import *

*表示將模塊中除了下劃線(_)開頭的元素全部元素導入

from base_module import *

fun_a()
fun_b()
print(num)

__all__控制import *的行為

我們在模塊中添加__all__,注意是一個字符串列表,下面是fun_a

print('這是一個自定義基本模塊')

num = 1000


def fun_a():
    print('fun_a', num)


def fun_b():
    print('fun_b')


__all__ = ['fun_a']

if __name__=='__main__':
    print('執(zhí)行了該文件')

我們再調(diào)用fun_b(),就會出現(xiàn)NameError:

相對導入與絕對導入

  • pkg_b.py
num_b = "num_b"

def fun_b():
    print("pkg_b fun_b")
  • pkg_c.py
from .pkg_b import fun_b
from . import pkg_b
num_c = "num_c"

def fun_c():
    print("pkg_c fun_c")


fun_b()
print(f"pkg_c中導入pkg_b:{pkg_b.num_b}")
  • base_import.py
import pkg_test.sub_pkg.pkg_b

from pkg_test.sub_pkg import pkg_b
from pkg_test.sub_pkg import pkg_c

pkg_test.sub_pkg.pkg_b.fun_b()

pkg_b.fun_b()

pkg_c.fun_c()
pkg_c.pkg_b.fun_b()

相對導入的模塊不能作為主程序運行,因為.會被替換為__main__,然后就會出現(xiàn):

ImportError: attempted relative import with no known parent package

小結(jié)

導入包和導入模塊基本一致,如何判斷是包還是模塊呢?

包通常是有結(jié)構(gòu),所以,看到import xxx.yyy這種包含.的import,就是導入的包。

import 包名.模塊名 as 別名
from . import 模塊名
from 包名 import 模塊名 as 別名
from 包名.模塊名 import 成員名 as 別名

更多內(nèi)容可以參考:

官方import說明

包說明

命名空間

Python的命名空間有點類似于變量表。

  1. local namespace,就是函數(shù)的命名空間,相當于局部變量表,包含函數(shù)的變量
  2. global namespace,就是模塊的命名空間,包含functions、classes、modules、變量、常量等
  3. build-in namespace,包含build-in function、exceptions,所有模塊均可訪問

Python對于變量的查找順序為:

  1. local namespace,當前函數(shù)或類方法,若找到,則停止搜索
  2. global namespace,當前模塊,若找到,則停止搜索
  3. build-in namespace,最后查找build-in命名空間
  4. 若變量不是build-in的內(nèi)置函數(shù)或變量,Python將報錯NameError

閉包比較特殊:在local namespace找不到該變量,會查找目標是父函數(shù)的local namespace

看一個簡單的示例:

print('這是一個自定義基本模塊')

num = 1000


def fun_a():
    print('fun_a', num)

def fun_b():
    print('fun_b')


if __name__=='__main__':
    fun_a()
    print('執(zhí)行了該文件')
from base_module import fun_a,num

print(num)
num = 5000
print(num)
fun_a()

我們可以看到,改變了num值,調(diào)用模塊中的方法的時候,還是方法的模塊直接的命名空間的num。

各類文件與目錄

  1. .pyo:優(yōu)化編譯后的文件
  2. .pyc:Python編譯之后的文件
  3. .pyd:包含Python代碼的庫文件(Windows)
  4. .pyi:靜態(tài)類型信息文件
  5. .so:Linux的動態(tài)鏈接庫
  6. .dll:Windows的動態(tài)鏈接庫
  7. __pycache__:用于存儲編譯Python源文件的字節(jié)碼文件目錄(sys.dont_write_bytecode開關(guān)控制)

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python數(shù)據(jù)分析與處理(二)——處理中國地區(qū)信息

    Python數(shù)據(jù)分析與處理(二)——處理中國地區(qū)信息

    這篇文章主要介紹了Python數(shù)據(jù)分析與處理-處理中國地區(qū)信息,上文介紹了北京高考分數(shù)線統(tǒng)計分析,這篇文章依然圍繞Python數(shù)據(jù)分析與處理的相關(guān)資料來介紹處理中國地區(qū)信息,需要的朋友可以參考一下
    2021-12-12
  • Python3讀寫ini配置文件的示例

    Python3讀寫ini配置文件的示例

    這篇文章主要介紹了Python3讀寫ini配置文件的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-11-11
  • pandas重置索引標簽的實現(xiàn)示例

    pandas重置索引標簽的實現(xiàn)示例

    在使用Pandas進行數(shù)據(jù)處理時,有時候我們可能會需要對數(shù)據(jù)進行重置索引的操作,本文主要介紹了pandas重置索引標簽的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • Python基礎教程之異常詳解

    Python基礎教程之異常詳解

    調(diào)試Python程序時,經(jīng)常會報出一些異常,下面這篇文章就來給大家介紹了關(guān)于Python基礎教程之異常的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2019-01-01
  • Python reduce函數(shù)作用及實例解析

    Python reduce函數(shù)作用及實例解析

    這篇文章主要介紹了Python reduce函數(shù)作用及實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Python破解excel進入密碼的過程詳解

    Python破解excel進入密碼的過程詳解

    這篇文章主要為大家介紹了如何利用Python破解excel進入密碼,文中的示例代碼講解詳細,對我們學習Python有一定幫助,感興趣的可以動手試一試
    2022-03-03
  • Python實現(xiàn)雙向RNN與堆疊的雙向RNN的示例代碼

    Python實現(xiàn)雙向RNN與堆疊的雙向RNN的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Python語言實現(xiàn)雙向RNN與堆疊的雙向RNN,文中詳細講解了雙向RNN與堆疊的雙向RNN的原理及實現(xiàn),需要的可以參考一下
    2022-07-07
  • Pytorch微調(diào)BERT實現(xiàn)命名實體識別

    Pytorch微調(diào)BERT實現(xiàn)命名實體識別

    命名實體識別(NER)是自然語言處理(NLP)中的一項關(guān)鍵任務,它涉及識別和分類文本中的關(guān)鍵實體,BERT是一種強大的語言表示模型,在各種 NLP 任務中顯著提高了性能,包括 NER,在本文中,我們將展示如何使用 PyTorch 對預訓練的 BERT 模型進行微調(diào),以用于 NER 任務
    2025-03-03
  • python中Requests發(fā)送json格式的post請求方法

    python中Requests發(fā)送json格式的post請求方法

    這篇文章主要介紹了python中Requests發(fā)送json格式的post請求方法,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的朋友可以參考一下
    2022-09-09
  • Python實現(xiàn)求取表格文件某個區(qū)域內(nèi)單元格的最大值

    Python實現(xiàn)求取表格文件某個區(qū)域內(nèi)單元格的最大值

    這篇文章主要介紹基于Python語言,基于Excel表格文件內(nèi)某一列的數(shù)據(jù),計算這一列數(shù)據(jù)在每一個指定數(shù)量的行的范圍內(nèi)(例如每一個4行的范圍內(nèi))的區(qū)間最大值的方法,需要的朋友可以參考下
    2023-08-08

最新評論

彩票| 洛浦县| 苍南县| 大同市| 中江县| 武乡县| 乡宁县| 资中县| 塔河县| 历史| 古浪县| 闸北区| 靖边县| 田东县| 安义县| 永济市| 年辖:市辖区| 柯坪县| 彭州市| 玛曲县| 神农架林区| 清远市| 深水埗区| 韶山市| 太原市| 精河县| 磴口县| 武邑县| 伊宁县| 芦溪县| 临江市| 佛山市| 九江县| 綦江县| 锦州市| 盐亭县| 江都市| 米脂县| 揭东县| 如东县| 峡江县|