Python 匯入迴圈問題

2021-07-31 14:05:11 字數 3300 閱讀 8667

一、匯入迴圈

在大型的python工程中,由於架構設計不當,可能會出現模組間相互引用的情況。

這時候需要通過一些方法來解決這個問題.

(1)重新設計架構,解除相互引用的關係。

(2)把import語句放置在模組的最後

(3)把import語句放置在函式中

1、重新設計架構,解除相互引用

-------- 後續補充 ---------

2、把import語句放置在模組最後

-------- 後續補充 ---------

3、把import語句放置在函式中

例子:乙個系統由兩部分組成,包括control主模組和submodule模組。

其中control模組包含ctlcommon()和control(),submodule模組包含submodule(),並且在submodule()中會用到ctlcommon()。

# control.py

from submodule import submodule

def ctlcommon():

print("enter ctlcommon")

def control():

print("-------enter control-------")

submodule()

print("++++++++exit control+++++++")

control()

# submodule.py

import control

def submodule():

print("enter submodule calling ctlcommon")

control.ctlcommon()

分析1:執行control.py

從traceback看,兩個模組互相匯入,造成匯入迴圈錯誤

$ python control.py    # 執行control.py

traceback (most recent call last):

file "d:\selfstudy\pythonstudy\grammar\basic usage\module\control.py", line 2, in from submodule import submodule

file "d:\selfstudy\pythonstudy\grammar\basic usage\module\submodule.py", line 2, in import control

file "d:\selfstudy\pythonstudy\grammar\basic usage\module\control.py", line 2, in from submodule import submodule

importerror: cannot import name 'submodule'

方案:把submodule.py中的匯入模組語句放在函式中

# submodule.py

def submodule():

import control

print("enter submodule calling ctlcommon")

control.ctlcommon()

結果分析:為了更好的理解執行過程,我們把submodule()在control()函式中展開。

執行control.py,會去執行control()函式。control()函式的執行步驟:

step1、執行(a)

step2、import control,由於是第一次匯入(import),會載入(load)該模組。

該模組的匯入**會被執行,因此執行一次control()函式。結果中黑色加粗的部分。

step3、順序執行(b), (c), (d)

def control():

print("-------enter control-------") # (a)

#submodule() # 把submodule()函式展開

import control

print("enter submodule calling ctlcommon") # (b)

control.ctlcommon() # (c)

print("++++++++exit control+++++++") # (d)

$ python control.py    # 執行control.py

-------enter control------- #(a)

-------enter control-------

enter submodule calling ctlcommon

enter ctlcommon

++++++++exit control+++++++

enter submodule calling ctlcommon # (b)

enter ctlcommon # (c)

++++++++exit control+++++++ # (d)

分析2:執行submodule.py

$ python submodule.py

-------enter control------- # (a)

enter submodule calling ctlcommon

enter ctlcommon

++++++++exit control+++++++ # (d)

結果分析:

執行submodule模組,首先去匯入和載入control模組

#import control   # 第一次匯入會去執行頂層目錄**,也就是說會去執行control()

control() # control中會先執行列印(a), 然後呼叫submodule(), 最後執行列印(d)

def submodule():

print("enter submodule calling ctlcommon")

control.ctlcommon()

python匯入迴圈問題

m1.py print 正在匯入m1 x m1 from m2 import y1 建立m2的命名空間 2 執行m2.py,將執行產生的名字丟到m2.py 3 在當前執行檔案中拿到m2.y m2.py print 正在匯入m2 y m2 from m1 import x1 建立m1的命名空間 2 執...

迴圈匯入問題

目錄python從入門到放棄完整教程目錄 m1.py print from m1.py from m2 import x y m1 建立m2的命名空間 執行m2.py,將執行產生的名字丟到m2.py 在當前執行檔案中拿到m2.x m2.py print from m2.py from m1 impo...

迴圈匯入問題

m1.py print from m1.py from m2 import x y m1 m2.py print from m2.py from m1 import y x m2 run.py import m1 我們可以使用函式定義階段只識別語法的特性解決迴圈匯入的問題,我們也可以從本質上解決迴圈...