模組迴圈匯入問題在乙個資料夾內建立三個.py檔案,m1.py 和 m2.py 和 run.py,前兩者作為被匯入模組,run.py為執行檔案
過程分析:#執行檔案內容
import m1
#m1模組內容
print('正在匯入m1...')
from m2 import y
x = 1
#m2模組內容
print('正在匯入m2...')
from m1 import x
y = 2
#執行run,結果:
正在匯入m1...
正在匯入m2...
importerror: cannot import name 'y'
1首先要明確的是:誰是執行檔案,誰是被匯入模組
2.首次匯入模組發生的三件事
執行run.py時,申請了run.py的命名空間,首次匯入m1時,申請m1這個被匯入模組的命名空間,開始執行m1模組內的**,執行到from m2 import y時開始申請m2的命名空間,執行m2的模組體**,再執行到from m1 import x 時,此時記憶體中已經存在m1的命名空間(雖然m1才執行到from m2 import y這裡),python就直接去m1模組的命名空間中去尋找x,並試圖在自己的命名空間內用乙個變數名x指向m1中x的記憶體位址,但是此時的m1中還未存在x與1這個值的繫結關係
解決方法:
1.匯入模組語句放在名字定義之後
2:匯入模組就是為了使用的,如果是在函式內使用被匯入模組,完全可以將匯入語句放在函式內#執行檔案內容
import m1
print(m1.y)
#m1模組內容
print('正在匯入m1...')
x = 1
from m2 import y
#m2模組內容
print('正在匯入m2...')
y = 2
from m1 import x
#執行run,結果:
正在匯入m1...
正在匯入m2...
2
這是利用了,函式在定義階段只檢測語法,而不執行**的原理#執行檔案內容
import m1
m1.f1()
#m1模組內容
print('正在匯入m1...')
def f1():
from m2 import y,f2
print('m1.f1--->y',y)
f2()
x=1#m2模組內容
print('正在匯入m2...')
def f2():
from m1 import x
print('m2.f2--->x',x)
y = 'm2'
#執行run,結果:
正在匯入m1...
正在匯入m2...
m1.f1--->y m2
m2.f2--->x m1
模組的搜尋路徑原則:記憶體中已經載入過的---->內建----->sys.path(注意:sys.path的第乙個路徑為執行檔案的所在當前資料夾)值得注意的是:所有被匯入模組的搜素路徑都是以執行檔案的sys.path為準
例如我們在建立dir0資料夾,在其內建立dir資料夾以及與其同一級的run.py執行檔案,在dir資料夾下建立兩個同一級別的m1.py,m2.py
#這些檔案run.py的內容
from dir import m3
#m1模組的內容
def f1():
print('m1.f1')
#m2模組的內容
import m1
m1.f1()
#執行結果
modulenotfounderror: no module named 'm1'
當我們將import m1 改為from dir import m1就正確了
模組的絕對匯入和相對匯入:絕對匯入:以執行檔案的sys.path為起點匯入
優點:執行檔案和被匯入模組都可以使用 缺點:匯入麻煩
相對匯入:參照當前所在檔案的資料夾為起點查詢
所以:上個模組搜尋路徑的例子, m3模組中的**可以改寫為:
from .m1 import f1
f1()
python朝聖之路 模組篇
模組 module 模組是乙個包含有一系列變數 函式 類等組成的程式組 模組是乙個檔案,模組檔案通常以.py結尾。作用 1.讓一些相關的變數 函式 類等有邏輯的組織在一起,是邏輯結構更加清晰。2.模組中的變數 函式和類可提供其他模組作用。模組的分類 1.內建模組 builtins 在直譯器的內部可以...
pyhton模組與包
1.什麼是模組 模組就是工具包,要想使用這個工具包中的工具 就好比函式 就需要匯入這個模組。模組是非常簡單的python檔案,單個python檔案就是乙個模組,兩個檔案就是兩個模組。2.模組的匯入 模組匯入的集中方式 1 import module1,module2 當直譯器遇到import語句,如...
pyhton中常用內建模組
在pyhton中,除了上篇寫到的os和os.path模組外,還有幾個是我們在python中常用到的內建模組。一.sys模組 1.sys.ar 在python指令碼傳參使用 2.sys.exit 系統退出 3.sys.getdefaultencoding 獲取系統預設編碼 4.sys.getfiles...