python | 關(guān)于不同層級的包package之間進(jìn)行import的問題

一 寫在前面

未經(jīng)允許,不得轉(zhuǎn)載,謝謝~~~

2020的第一篇博客就獻(xiàn)給踩過的第一個坑吧 (〃′-ω?)

大家新年快樂!新的一年沖鴨~~~

二 最簡單的import情況

日常情況下我們自己寫程序一般就會碰到以下兩種情況的代碼調(diào)用:

1. 同級目錄

這是最簡單的一種情況。

例如同級目錄下的main.py要調(diào)用model.py,那么直接import即可。

Projects/
    - main.py
    - model.py

2. 子級目錄

這也是很常見的一種情況。

例如根目錄下的main.py要調(diào)用models子集目錄下的p3d.py

  • 首先在models文件夾下新建一個__init__.py文件,空即可。
  • 然后在main.py中即可import models.p3d, from models.p3d import xx
Projects/
    - main.py
    - models/
        - p3d.py
        - c3d.py
        - i3d.py

三 比較復(fù)雜的package調(diào)用情況

3.1 場景描述:

以上的兩種情況基本都是所有的代碼都是自己寫的這種情況,但我們有的時候需要從github上扒一份別人的代碼作整個項目里面的一個component,這種時候就沒有那么方便。

通常下載的代碼本身就有很多相互代碼之間的相互調(diào)用關(guān)系,所以不能輕易改變其路徑,不然你可能需要挨個修改每個的調(diào)用。

當(dāng)然最簡單的方法是將你自己的東西全部放在他的目錄結(jié)構(gòu)里面去,例如在這個例子中將main.py挪到detectron 中,將detectron作為你的項目主目錄,但是這樣子會破壞代碼的結(jié)構(gòu)性,不是很推薦。

例如detectron是原本獨立的一份項目代碼,我現(xiàn)在想將其加到我的Projects里面:
(具體目錄結(jié)構(gòu)如下示意)

Projects/
    - main.py
    - detectron/
        - demo/
              - demo.py
              - predict.py
        - detectron/
              - backbones/
                    - xxx.py
                    - ...
              - detection/
                    - xxx.py
                    - ...
        - __init__.py

3.2 解決思路:

  1. 那么第一件是在detectron中加入__init__,標(biāo)注其為package
  2. 這個時候理論上來說我可以main.py中用import detectron.demo.predict的形式來調(diào)用predict中的內(nèi)容。
  3. 但以上的情況僅限于predict.py里面沒有調(diào)用其他detectron中的代碼文件的情況,這一點對于一個集成性比較好的package是不可能的。會出錯的原因在于在predict.py中調(diào)用其他的代碼文件的時候是從它自己原來的主目錄開始的,例如在它里面可能會通過import detectron.backbones.xxx的形式來調(diào)用backbones下的代碼。
  4. 但是我們在main.py中去執(zhí)行代碼的時候,上面的方式就會出錯,完整的應(yīng)該是import detectron.detectron.backbones.xxx
  5. 所以解決方法有兩個:
    • 1: 將所有原來代碼中的import語句前面補上一個路徑,即從:import detectron.backbones.xxx-->import detectron.detectron.backbones.xxx (推薦代碼量小的情況使用)
      1. 解決路徑檢索不到的問題:
     import sys
     # add the path of detectron to your Projects
     sys.path.append('./detectron')
    

3.3 彩蛋:BUG

沒想到還有吧哈哈哈哈哈!

正常情況下用sys將路徑append進(jìn)來以后就沒有什么關(guān)系了,但是文章開頭就是為了記錄坑,在這個意義上前面的內(nèi)容全是鋪墊。/捂臉

這個BUG昨天找了將近2個小時─━ _ ─━?

細(xì)心的同學(xué)可能注意到detectron有兩個重名目錄,一個是原本的主目錄detectron/,一個是原來主目錄下的子目錄detectron/detecron/。這種情況如果將其作為獨立的代碼來看是完全沒有問題的。但是在將原來的主目錄放在Projects/下面的時候就出現(xiàn)問題了==

具體的表現(xiàn)在于我用sys.path.append的方式將detectron/加到路徑里,正常情況下就可以不修改原來的import detectron.backbones.xxx的調(diào)用方式找到backbones里面的文件。

但是??!由于兩個目錄重名,所以在搜索的時候每次搜到上面那個detectron就停掉了,不會檢索到下面的detectron

解決方法:

修改重名目錄中的其中一個目錄名。

四 寫在最后

暫時就先寫到這里吧

其實中間還嘗試過想直接用過用subprocess.call來調(diào)用python xxx.py的方式來避免上面的問題,但是這樣的問題是只能執(zhí)行該文件,輸出的結(jié)果只會打印在屏幕,么有辦法直接將想要的結(jié)果return回來。

希望新的一年有時間多寫一些blog(立個FLAG哈哈哈)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容