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

詳解Python中import模塊導入的實現原理

 更新時間:2023年08月21日 10:09:53   作者:Mindtechnist  
這篇文章主要給大家介紹了Python中import模塊導入的實現原理,主要從什么是模塊,import搜索路徑以及導入原理這三個方面給大家介紹,感興趣的小伙伴跟著小編一起來看看吧

什么是模塊

一個.py文件就是一個模塊,即Module。模塊分為三種:python標準庫、第三方模塊、應用程序自定義模塊。

  • import語句 – 導入模塊
  • Directory – 文件夾(空的)
  • Package – 比文件夾多了一個__init__.py
"""
file: cal.py
"""
def add(x, y)
	return x+y
def sub(x, y)
	return x-y
print(‘hello cal')
"""
file: test.py
"""
import cal 
print(cal.add(1, 2))

import做了什么?

import導入模塊的時候,首先會把導入的文件執(zhí)行一遍,比如說我們運行test.py的時候,print(‘hello cal’)也會被執(zhí)行,因為import cal的時候就把cal.py運行了一遍。所以,我們在模塊文件中只寫功能(也就是函數),而不要寫可執(zhí)行的語句。

  • 執(zhí)行被引入的py文件,即使只引入一個變量(from cal import add),也會運行整個文件。
  • 引入變量名 → 文件名變量

引入多個模塊

import cal, time

只引入一個方法

# 只引入一個方法
from cal import add
print(add(1, 2)) #可以直接使用add,不用加cal.

引入所有方法,不推薦使用,你并不知道都引入了哪些變量,可能會出現本文件變量與引入變量名字重復的情況。

#引入所有方法 – 不推薦使用,你并不知道都引入了哪些變量,可能會出現本文件變量與引入變量名字重復的情況。
from cal import *
#新的變量名會覆蓋舊的變量名
#+++++++++++++++++++++++++++
from cal import *
def add(x, y)
	return x+y+100
print(add(1, 2))
#+++++++++++++++++++++++++++
def add(x, y)
	return x+y+100
from cal import *
print(add(1, 2))
#+++++++++++++++++++++++++++

import搜索路徑

import sys
print(sys.path) #查看路徑

path中包含python自己定義的路徑,以及當前執(zhí)行的py文件的路徑,也就是說當前執(zhí)行路徑會被自動加入到sys.path中,import就是按照這些路徑去搜索被引入的變量的。也可以通過手動添加路徑

from path import cal
#path就是cal所在的路徑

import導入模塊的原理

首先import會根據路徑找到文件,根據路徑找到模塊后把模塊加載到內存中執(zhí)行一遍,執(zhí)行的時候是把模塊的內容拷貝到當前文件執(zhí)行。import導入是將模塊從磁盤中把磁盤文件導入到內存中,這個速度是比較慢的,實際上,在導入時會有一個導入緩存,同一個模塊在導入第一次的時候會有一個緩存,以后再導入都是用的緩存的導入,所以有時候你可能遇到這樣的問題,被導入的文件已經刪除了,但是程序還是能運行,這是因為程序使用的是緩存的導入模塊。

from path import mode,它相當于把路徑進行了一次拼接path\mode.py,這是from的工作。路徑拼接是在當前執(zhí)行文件的路徑基礎上進行拼接。

在這里插入圖片描述

當引入了很多模塊的時候,一個目錄下會有很多py文件,一般把bin.py作為要執(zhí)行的文件,也就是整個程序的入口。而邏輯主文件叫做main.py,這里面包含了程序的主要邏輯,其他功能都放到其它文件中作為一個模塊。我們在運行的時候,運行bin.py,由bin.py去調用main.py中的主邏輯。也就是說只有bin是可執(zhí)行的,其余文件都不應作為執(zhí)行文件。

前面說過,sys.path中只會加入當前運行程序所在的路徑,bin.py是整個程序的運行文件,也就是說sys.path中只會加入bin.py的路徑,假如說文件有如下導入關系

在這里插入圖片描述

假如說main.py和cal.py在同一級目錄,那么不用加路徑即可導入,但是如果bin.py和這兩個文件不在同一級目錄(比如在上一級目錄),那么bin.py導入main.py的時候就要加上main.py的路徑,但是這樣在執(zhí)行的時候會報錯,因為bin.py間接導入了cal.py,并且bin.py只加了main.py的路徑而沒有加cal.py的路徑,前面說過sys.py只會包含當前運行路徑,也就是bin.py的路徑。解決方法有兩個:

  • 在main.py中加上cal.py的路徑from path import cal;
  • 把路徑加到sys.path中;

file 獲取當前文件名

os.path.dirname(__file__)  #獲取當前文件路徑
os.path.dirname(os.path.dirname(__file__))  #獲取當前文件的上一級路徑

pycharm會自己根據當前文件名獲取絕對路徑,并把絕對路徑通過os.path.dirname()返回給我們os.path.dirname(file),但是在終端運行的時候,終端并沒有這個功能,我們需要自己去找到絕對路徑,然后根據絕對路徑找到文件名,并反推出上一級目錄。

p = os.path.dirname(__file__) #獲取當前文件的絕對路徑
BASEDIR = os.path.dirname(os.path.dirname(p))
sys.psth.append(BASEDIR)

實際上,這三步的操作相當于把當前運行文件的上一級目錄通過相對路徑的方式添加到了環(huán)境變量。如果我們以絕對路徑的方式添加環(huán)境變量,當我們換了電腦或者環(huán)境,環(huán)境變量就失效了。我們這樣通過程序找出相對路徑來添加到環(huán)境變量,只要將當前整個工程一塊拷貝到別的機器,就一定可以找到這個環(huán)境變量。

以上就是詳解Python中import模塊導入的實現原理的詳細內容,更多關于Python import模塊導入的資料請關注腳本之家其它相關文章!

相關文章

  • pytorch Dropout過擬合的操作

    pytorch Dropout過擬合的操作

    這篇文章主要介紹了pytorch Dropout過擬合的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • 使用Dajngo 通過代碼添加xadmin用戶和權限(組)

    使用Dajngo 通過代碼添加xadmin用戶和權限(組)

    這篇文章主要介紹了使用Dajngo 通過代碼添加xadmin用戶和權限(組),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python中的文件和目錄操作實現代碼

    Python中的文件和目錄操作實現代碼

    對于文件和目錄的處理,雖然可以通過操作系統(tǒng)命令來完成,但是Python語言為了便于開發(fā)人員以編程的方式處理相關工作,提供了許多處理文件和目錄的內置函數。重要的是,這些函數無論是在Unix、Windows還是Macintosh平臺上,它們的使用方式是完全一致的。
    2011-03-03
  • Python中幾種導入模塊的方式總結

    Python中幾種導入模塊的方式總結

    下面小編就為大家?guī)硪黄狿ython中幾種導入模塊的方式總結。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • 淺談PyTorch的數據讀取機制Dataloader與Dataset

    淺談PyTorch的數據讀取機制Dataloader與Dataset

    這篇文章主要介紹了淺談PyTorch的數據讀取機制Dataloader與Dataset,DataLoader的作用是構建一個可迭代的數據裝載器,每次執(zhí)行循環(huán)的時候,就從中讀取一批Batchsize大小的樣本進行訓練,需要的朋友可以參考下
    2023-07-07
  • 基于Python的GUI圖形用戶界面編程詳細講解

    基于Python的GUI圖形用戶界面編程詳細講解

    GUI圖形用戶界面編程,我們可以通過python提供的豐富的組件,快速的實現使用圖形的界面和用戶交互, GUI編程類似于“搭積?”,將?個個組件(Widget)放到窗?中,這篇文章主要給大家介紹了基于Python的GUI圖形用戶界面編程的相關資料,需要的朋友可以參考下
    2022-12-12
  • Python之py2exe打包工具詳解

    Python之py2exe打包工具詳解

    下面小編就為大家?guī)硪黄狿ython之py2exe打包工具詳解。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 利用Python找回微信撤回信息

    利用Python找回微信撤回信息

    一條撤回的微信消息,就像一個秘密,讓你迫切地想去一探究竟。這篇文章就將為大家介紹如何用Python找回撤回的微信信息,感興趣的可以試一試
    2022-01-01
  • python實現對文件中圖片生成帶標簽的txt文件方法

    python實現對文件中圖片生成帶標簽的txt文件方法

    下面小編就為大家分享一篇python實現對文件中圖片生成帶標簽的txt文件方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • PyTorch之torch.randn()如何創(chuàng)建正態(tài)分布隨機數

    PyTorch之torch.randn()如何創(chuàng)建正態(tài)分布隨機數

    這篇文章主要介紹了PyTorch之torch.randn()如何創(chuàng)建正態(tài)分布隨機數問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評論

凭祥市| 景德镇市| 陆丰市| 青岛市| 河间市| 十堰市| 永登县| 漠河县| 石城县| 景泰县| 苏尼特左旗| 建水县| 澎湖县| 德惠市| 黄梅县| 台州市| 昌都县| 嘉义市| 邵阳市| 门源| 巴林左旗| 全椒县| 延寿县| 南宁市| 洪雅县| 丰顺县| 眉山市| 金溪县| 德兴市| 邮箱| 东台市| 洞头县| 元朗区| 云林县| 伊宁市| 馆陶县| 沧源| 东乡| 龙南县| 青铜峡市| 贵南县|