Python模組及不同目錄下匯入模組方法

2021-09-24 12:16:18 字數 4085 閱讀 9388

在實際程式開發過程中,隨著我們**越寫越多,檔案中**越來越長,最終導致越來越難以維護。為了編寫可維護**,我們可以把很多函式分組,分別放到不同檔案裡。在python中,乙個 .py 檔案就稱為乙個模組(module)。為避免模組名衝突,python引入了按目錄來組織模組的方法,稱為包(package)。

使用模組優點:①提高**可維護性 ②編寫**不必從零開始,當乙個模組編寫完畢,就可以被其他地方引用。③避免函式名和變數名衝突,相同名字的函式和變數完全可以分別存在不同的模組中。

說了半天,到底什麼是模組?什麼是包?舉個簡單例子一目了然:

mycompany

├─ __init__.py

├─ abc.py

└─ xyz.py

其中,mycompany就是頂層包名,abc.py檔案是乙個名字叫abc的模組,xyz.py檔案是乙個名字叫xyz的模組。

引入包以後,只要頂層包名不發生命名衝突,其下所有模組都不會與別的模組發生衝突。在這裡abc.py模組的名字變為mycompany.abc,同樣的xyz.py模組名變為mycompany.xyz.

細心的同學還會發現,每乙個包目錄下面都會有乙個__init__.py檔案,這個檔案是必須存在的,否則,python機會把這個目錄當成普通目錄,而不是乙個包。__init__.py可以是空檔案,也可以有python**,因為__init__.py本身就是乙個模組,而它的模組名為mycompany.

類似的,還有多級目錄,組成多層次的包結構。如下面的目錄結構:

mycompany

├─ web

│ ├─ __init__.py

│ ├─ utils.py

│ └─ xyz.py

├─ __init__.py

├─ abc.py

└─ utils.py

這裡檔案xyz.py的模組名為mycompany.web.xyz,而兩個utils.py的模組名分別為mycompany.utils和mycompany.web.utils。

注:a、模組是一組python**的集合,可以使用其他模組,也可以被其他模組使用。

b、建立自己模組時要注意:模組名要遵循python變數命名規範,不使用中文、特殊字元;模組名不要和系統中模組名衝突,最好先檢視系統是否已經存在該模組,檢查方法是在python互動環境執行import ***,若成功則說明系統存在此模組。

目錄結構如下:

mycompany

├─ model1.py

└─ model2.py

若在程式model2.py中匯入模組model1.py,則可以直接使用 import model1 或 from model1 import ***(from model1 import *);

目錄結構如下:

mycompany

├─ web

│ ├─ abc.py

│ └─ xyz.py

├─ model1.py

└─ model2.py

若在程式model1.py中匯入模組abc.py,可以在web資料夾中建立空資料夾__init__.py檔案。新目錄結構如下:

mycompany

├─ web

│ ├─ abc.py

│ |_ xyz.py

| |_ __init__.py

├─ model1.py

└─ model2.py

使用from web.abc import *** 或者 import web.abc (輸出需要print(web.abc.***(引數)))

目錄結構如下:

mycompany

├─ web

│ ├─ abc.py

│ |_ xyz.py

| |_ __init__.py

| |——lib

| |_ test1.py

| ├─ model1.py

└─ model2.py

若程式test1.py中匯入abc.py 和 model1.py,做法是先跳到mycompany目錄下面,直接可以呼叫model1.py,然後在web下建立乙個空檔案__init__.py,這個檔案我們上一步已經建過了,建好以後就可以像第2步調用子目錄下模組一樣,通過import web.abc 進行呼叫。具體**如下:

import sys

import model1

import web.abc

注:列印輸出print(model1.方法名(引數))

print(web.abc.方法名(引數))

import os

import sys

'''print(__file__)#獲取當前程式路徑,注意:這裡列印出來的路徑為相對路徑

#動態獲取絕對路徑

print(os.path.abspath(__file__)) #這才是當前程式絕對路徑

print(os.path.dirname(os.path.abspath(__file__))) #當前程式上一級目錄,其中dirname返回目錄名,不要檔名

print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#當前程式上上一級目錄

'''base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #當前程式上上一級目錄,這裡為mycompany

import model1

import web.abc

在python模組的每乙個包中,都有乙個__init__.py檔案(這個檔案定義了包的屬性和方法),然後是一些模組檔案和子目錄,假如子目錄中也有__init__.py那麼它就是這個包的子包。當我們將乙個包作為模組匯入(比如從xml匯入dom)的時候,實際上匯入了它的__init__.py檔案。

乙個包是乙個帶有特殊檔案__init__.py的目錄。__init__.py檔案定義了包的屬性和方法,其實它可以什麼也不定義,即只是乙個空檔案,但是必須存在。如果__init__.py這個檔案不存在,這個目錄就僅僅是乙個普通目錄,而不是乙個包,它就不能被匯入或者包含其他的模組和巢狀包。

前面說了,包的目錄中必須包含乙個__init__.py檔案,它可以是空檔案,也可以寫包初始化相關**,或者定義 __all__ 變數。__all__變數是乙個列表,它列舉了這個包包含的子模組名稱。如果此時目錄如下:

mycompany

├─ web

│ ├─ abc.py

│ |_ xyz.py

| |_ __init__.py

| |_ demo

| |_ demo.py

| |——lib

| |_ test1.py

| ├─ model1.py

└─ model2.py

當我們使用全部匯入,也就是 from web import *(通常不主張這樣做,會導致**可讀性降低,而且如果我們自己命名和模組裡面的名稱一樣,就會覆蓋模組裡面的名字) ,實際上會把這個模組名稱列表裡面的模組名稱匯入,如下:。如果覺得從包中匯入 * 的操作沒有必要,也可以不定義__all__這個變數。但是在更新包之後__all__也需要更新。

#__init__.py檔案

__all__ = ["abc","xyz","demo"]

#方法一:pip安裝

電腦如果有多個版本的python時,pip3可以自動判別用python3來安裝庫,是為了避免與python2發生衝突。

如果電腦僅僅安裝了python3,那麼使用pip或者pip3是一樣的。

pip install ***

新安裝的第三方庫會放到這個目錄下面:python2.7/site-packages

pip3 install ***

新安裝的第三方庫會放到這個目錄下面:python3.6/site-packages

conda install ***

Python在不同目錄下匯入模組的方法

python在不同層級目錄import模組的方法 使用python進行程式編寫時,經常會呼叫不同目錄下的模組及函式。本篇部落格針對常見的模組呼叫講解匯入模組的方法。1.同級目錄下的呼叫 目錄結構如下 src mod1.py test1.py 若在程式test1.py中匯入模組mod1,則直接使用 i...

python匯入不同目錄下的自定義模組過程解析

一 目錄結構 自定義的模組在common包下,study檔案下selectionsort.py檔案匯入自定義的模組 二 原始碼 2.1 selectionsort.py檔案 python導包預設是從sys.path中搜尋的。sys.path結果如下 d pycharm source study d ...

Discuz NT不同目錄下安裝方法

不同目錄下的安裝方法 根據目前大家對論壇的使用需求,在安裝上面大致有三種情況,站點根目錄下安裝,站點虛擬目錄下安裝和站點子目錄下安裝。根目錄安裝是最簡單也是穩定係數最高的安裝和使用方式,為我們的推薦方式。論壇配置項不需要做任何調整,只需要將站點程式 安裝包upload files目錄內的所有檔案 上...