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