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

在這里插入圖片描述

歡迎關注博主 Mindtechnist 或加入【Linux C/C++/Python社區】一起探討和分享Linux C/C++/Python/Shell編程、機器人技術、機器學習、機器視覺、嵌入式AI相關領域的知識和技術。


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

      • 什么是模塊
      • import搜索路徑
      • import導入模塊的原理
      • 圖書推薦


專欄:《python從入門到實戰》


什么是模塊

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

  • 執行被引入的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+100from cal import *
print(add(1, 2))
#+++++++++++++++++++++++++++

import搜索路徑

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

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

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

import導入模塊的原理

首先import會根據路徑找到文件,根據路徑找到模塊后把模塊加載到內存中執行一遍,執行的時候是把模塊的內容拷貝到當前文件執行。import導入是將模塊從磁盤中把磁盤文件導入到內存中,這個速度是比較慢的,實際上,在導入時會有一個導入緩存,同一個模塊在導入第一次的時候會有一個緩存,以后再導入都是用的緩存的導入,所以有時候你可能遇到這樣的問題,被導入的文件已經刪除了,但是程序還是能運行,這是因為程序使用的是緩存的導入模塊。
from path import mode,它相當于把路徑進行了一次拼接path\mode.py,這是from的工作。
路徑拼接是在當前執行文件的路徑基礎上進行拼接。
在這里插入圖片描述
當引入了很多模塊的時候,一個目錄下會有很多py文件,一般把bin.py作為要執行的文件,也就是整個程序的入口。而邏輯主文件叫做main.py,這里面包含了程序的主要邏輯,其他功能都放到其它文件中作為一個模塊。我們在運行的時候,運行bin.py,由bin.py去調用main.py中的主邏輯。也就是說只有bin是可執行的,其余文件都不應作為執行文件。
前面說過,sys.path中只會加入當前運行程序所在的路徑,bin.py是整個程序的運行文件,也就是說sys.path中只會加入bin.py的路徑,假如說文件有如下導入關系
在這里插入圖片描述
假如說main.py和cal.py在同一級目錄,那么不用加路徑即可導入,但是如果bin.py和這兩個文件不在同一級目錄(比如在上一級目錄),那么bin.py導入main.py的時候就要加上main.py的路徑,但是這樣在執行的時候會報錯,因為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)

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

圖書推薦

🔥強化學習:原理與Python實戰

強化學習利用獎勵信號訓練智能體。有些任務并沒有自帶能給出獎勵信號的環境,也沒有現成的生成獎勵信號的方法。為此,可以搭建獎勵模型來提供獎勵信號。在搭建獎勵模型時,可以用數據驅動的機器學習方法來訓練獎勵模型,并且由人類提供數據。我們把這樣的利用人類提供的反饋數據來訓練獎勵模型以用于強化學習的系統稱為人類反饋強化學習,示意圖如下。
在這里插入圖片描述
想要學好這些知識,一定要有好的工具書,下面推薦一本理論與實踐結合的好書。

書名:《強化學習:原理與Python實戰》
作者:肖智清
出版社:機械工業出版社
購買鏈接:點擊購買
在這里插入圖片描述


在這里插入圖片描述
在這里插入圖片描述


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42438.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42438.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42438.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

京東門詳一碼多端探索與實踐 | 京東云技術團隊

本文主要講述京東門詳業務在支撐過程中遇到的困境,面對問題我們在效率提升、質量保障等方向的探索和實踐,在此將實踐過程中問題解決的思路和方案與大家一起分享,也希望能給大家帶來一些新的啟發 一、背景 1.1、京東門詳介紹 1.1.1、京東門…

VB+SQL上機考試系統設計與實現

摘 要 隨著計算機技術的迅猛發展,學校教學和管理的信息化發展也有長足的進步,這就要求各個環節都均衡發展,從軟硬件雙方面把學校建設成一流的信息管理、教育教學的平臺。本文設計開發的考試管理系統也是其中重要的一個方面。該系統本著減輕教師工作負擔、提高工作效率、優…

六、分組背包

六、分組背包 題記算法題目代碼 題記 一個旅行者有一個最多能裝V公斤的背包和有N件物品,它們的重量分別是W[1],W[2],…,W[n],它們的價值分別為C[1],C[2],…,C[n]。這些物品被劃分為若干組,每組中的物品互相沖突&#…

【es6】函數參數設置默認值

1、es6之前的函數參數默認值寫法 1.1、使用短路或||的寫法 當y為空時,y判斷為false ,走||右邊的,所以y world;當y不為空時,y判斷為true,不需要再運行||右邊的,所以 y y function log(x, y) {y y || W…

數據的深海潛行:數據湖、數據倉庫與數據湖庫之間的微妙關系

導言:數據的重要性與存儲挑戰 在這個信息爆炸的時代,數據已經成為企業的核心資產,而如何高效、安全、便捷地存儲這些數據,更是每個組織面臨的重大挑戰。 數據作為組織的核心資產 數據在過去的幾十年里從一個輔助工具演變成企業的…

Ubuntu 20.04(服務器版)安裝 Anaconda

0、Anaconda介紹 Anaconda是一個開源的Python發行版本,包含了包括Python、Conda、科學計算庫等180多個科學包及其依賴項。因此,安裝了Anaconda就不用再單獨安裝CUDA、Python等。 CUDA,在進行深度學習的時候,需要用到GPU&#xf…

操作符詳解上(非常詳細)

目錄 二進制介紹二進制2進制轉10進制10進制轉2進制數字2進制轉8進制和16進制2進制轉8進制2進制轉16進制 原碼、反碼、補碼移位操作符左移操作符右移操作符 位操作符:&、|、^逗號表達式 二進制介紹 在初學計算機時我們常常會聽到2進制、8進制、10進制、16進制……

C++中String的語法及常用接口用法

在C語言中,string是一個標準庫類(class),用于處理字符串,它提供了一種更高級、更便捷的字符串操作方式,string 類提供了一系列成員函數和重載運算符,以便于對字符串進行操作和處理。 一、string…

scala TraversableOnce

scala TraversableOnce 1. 由來 TraversableOnce是Scala中的一個特質(trait),它定義了一組操作,用于遍歷和處理集合類型的元素。它是Scala集合層次結構中的基本概念之一。 2. 示例 以下是使用TraversableOnce的簡單示例&#…

Redis高可用:主從復制詳解

目錄 1.什么是主從復制? 2.優勢 3.主從復制的原理 4.全量復制和增量復制 4.1 全量復制 4.2 增量復制 5.相關問題總結 5.1 當主服務器不進行持久化時復制的安全性 5.2 為什么主從全量復制使用RDB而不使用AOF? 5.3 為什么還有無磁盤復制模式&#xff…

C# 一種求平方根的方法 立方根也可以 極大 極小都可以

不知道研究這些干啥&#xff0c;純純的浪費時間。。。 public static double TQSquare(double number){Random random1 new Random(DateTime.Now.Millisecond);double x1 0, resultX1 0, diff 9999999999, diffTemporary 0;for (int i 0; i < 654321; i){if (random1…

怎么做Tik Tok海外娛樂公會呢?新加坡市場怎么樣?

一、為什么選擇TikTok直播 1. 海外市場潛力巨大 ? 自2016年始&#xff0c;多家直播平臺陸續拓展至東南亞、中東、俄羅斯、日韓、歐美、拉美等地區。 ? 海外市場作為直播發展新藍海&#xff0c;2021年直播行業整申請cmxyci體規模達百億美元&#xff0c;并維持高速增長。 &a…

C++初階語法——內部類

前言&#xff1a;內部類&#xff0c;顧名思義是定義在類中的類&#xff0c;許多人會以為它屬于外部的類&#xff0c;實際上并不是&#xff0c;它們是兩個獨立的類&#xff0c;但是內部類受外部類類域的限制。 目錄 一.概念二.特性1.內部類和外部類相互獨立2.內部類是外部類的友…

10,遍歷任意參

遍歷可變參數 遍歷可變參數獲取可變參數大小通過遞歸方式遍歷可變參數通過可變參數特性來求和 遍歷可變參數 #pragma oncetemplate<class ... ParamTypes> void Func(paramTypes &... param) {}可以看作是有一個結構體里面裝滿了參數&#xff0c;把結構體放到…中。…

Git多版本并行開發實踐

本文目的&#xff1a; 實現多個項目同時進行的git多版本管理工作流。 名詞解釋&#xff1a; feature-XXXX&#xff1a;特性分支指CCS中一個項目或者一個迭代&#xff0c;在該分支上開發&#xff0c;完成后&#xff0c;合并&#xff0c;最后&#xff0c;刪除該分支&#xff0c;…

【廣州虛擬現實開發】VR智能中控系統進一步提高VR教學管理水平

隨著科技的不斷發展&#xff0c;虛擬現實(VR)技術已經逐漸走進了人們的生活。在教育領域&#xff0c;VR技術也得到了廣泛的應用&#xff0c;尤其是在教學終端中控系統方面。那么&#xff0c;廣州華銳互動開發的VR智能中控系統對學校有何益處呢&#xff1f; 首先&#xff0c;VR智…

RocketMQ(模式詳解,安裝)及控制臺安裝

下載 環境 64位操作系統&#xff0c;推薦 Linux/Unix/macOS 64位 JDK 1.8下載地址 https://rocketmq.apache.org/zh/download/ RocketMQ 的安裝包分為兩種&#xff0c;二進制包和源碼包。 二進制包是已經編譯完成后可以直接運行的&#xff0c;源碼包是需要編譯后運行的。 單…

LVS負載均衡DR(直接路由)模式

在LVS&#xff08;Linux Virtual Server&#xff09;負載均衡中的DR&#xff08;Direct Routing&#xff09;模式下&#xff0c;數據包的流向如下&#xff1a; 客戶端發送請求到負載均衡器&#xff08;LVS&#xff09;的虛擬IP&#xff08;VIP&#xff09;。負載均衡器&#x…

基于C++ 的OpenCV繪制多邊形,多邊形多條邊用不用的顏色繪制

使用基于C的OpenCV庫來繪制多邊形&#xff0c;并且為多邊形的不同邊使用不同的顏色&#xff0c;可以按照以下步驟進行操作&#xff1a; 首先&#xff0c;確保你已經安裝了OpenCV庫并配置好了你的開發環境。 導入必要的頭文件&#xff1a; #include <opencv2/opencv.hpp&g…

Bryntum Scheduler Pro 5.5.1 Crack

BRYNTUM 調度程序專業版,專業的日程安排小部件 Bryntum Scheduler Pro 5.5.1 一個專業有大腦的調度UI組件。Scheduler Pro 可幫助您安排任務&#xff0c;同時考慮資源和任務的可用性。 連接您的任務 讓 Scheduler Pro 處理剩下的事情。它將根據您定義的鏈接安排您的任務并遵守任…