寫 python 很久了,今天本沒打算熬夜,但卻被這麼簡單的問題困到了
零點半
… 有點像腦筋急轉彎。
在 VS Code 等輕量文本編輯器/項目管理器中,我不希望像 pycharm 一樣由配置文件自動管理我們的調用模塊路徑
。但這就有一個問題:需要我們寫幾行代碼,將自定義模塊的路徑添加到系統路徑中
。
這並不麻煩,我很喜歡微軟的這個深度學習項目,我一直將其風格作爲自己寫 python 算法項目的規範:
其算法實現封裝在 lib 中
,而我們實現算法時,並不需要直接調用 lib 中的任何東西
。我們只需要調用 moment_localization 中的文件。即只需要兩步:
- 訓練模型:
python.exe test.py
- 測試模型:
python.exe train.py
那麼問題來了,test.py
與 train.py
中是如何識別並調用 lib 模塊的呢?
答案在 _init_paths.py
中:
import os.path as osp
import sys
def add_path(path):
if path not in sys.path:
sys.path.insert(0, path)
this_dir = osp.dirname(__file__)
lib_path = osp.join(this_dir, '..', 'lib')
add_path(lib_path)
簡單的幾行代碼,獲取 lib 的絕對路徑
,並徹底將 lib 加入我們的系統路徑中。一勞永逸。甚至在 lib 中的各個模塊中,也無需 init paths
。
那麼問題來了,這麼簡單的道理,誰都能一看就懂,爲什麼很久 python 使用經驗的我困在這裏一個小時呢![\迷之微笑]
請記住:sys.path.append()添加的是路徑不是模塊!
sys.path.append()添加的是路徑不是模塊!
sys.path.append()添加的是路徑不是模塊!
在這個地方耽誤時間,實在是令人汗顏:就好像善於解答壓軸數學題的高中生總是計算上出現錯誤一樣可惜。
我的文件結構是這樣的:
-- library
|-- core
|-- rectangle.py
|-- utils
|-- ...
-- test
|-- test.py
|-- _init_path.py
在 _init_path.py
中,我將 library “規範地”導入了:
import os.path as osp
import sys
def add_path(path):
if path not in sys.path:
sys.path.append(path)
# print(sys.path)
this_dir = osp.dirname(__file__)
lib_path = osp.join(this_dir, '..', 'library')
add_path(lib_path)
但是當我在 test.py
中測試時,卻總是告訴我:沒有 library 模塊
。
我迷惑了好久,直到我將 sys.path
打印出來:
我才終於意識到:sys.path.append()添加的是路徑不是模塊!
不要 import library
了!library
作爲路徑,已經被添加了!library
下的各個文件夾,纔是我們的自定義模塊,直接調用就可以了!
上午提到過,我的項目結構是:
-- library
|-- core
|-- rectangle.py
|-- utils
|-- ...
-- test
|-- test.py
|-- _init_path.py
那麼,直接 import core
便好。嗯。[\迷之微笑]
如果想直接通過 core
調用 rectangle.py
中的函數,可以在 core
下加一個 __init__.py
:
-- library
|-- core
|-- rectangle.py
|-- __init__.py
|-- utils
|-- ...
-- test
|-- test.py
|-- _init_path.py
__init__.py
在模塊被調用時自動運行,其中可以有:
from .rectangle import *
.rectangle
表示當前目錄下的 rectangle.py
文件。
晚睡了,實在不該。
2020-3-29 00:55:31
Piper Liu