【python & VS Code】調用自定義模塊 ModuleNotFoundError: No module named XXX

寫 python 很久了,今天本沒打算熬夜,但卻被這麼簡單的問題困到了 零點半 … 有點像腦筋急轉彎。

在 VS Code 等輕量文本編輯器/項目管理器中,我不希望像 pycharm 一樣由配置文件自動管理我們的調用模塊路徑。但這就有一個問題:需要我們寫幾行代碼,將自定義模塊的路徑添加到系統路徑中

這並不麻煩,我很喜歡微軟的這個深度學習項目,我一直將其風格作爲自己寫 python 算法項目的規範:

其算法實現封裝在 lib 中,而我們實現算法時,並不需要直接調用 lib 中的任何東西。我們只需要調用 moment_localization 中的文件。即只需要兩步:

  • 訓練模型:python.exe test.py
  • 測試模型:python.exe train.py

那麼問題來了,test.pytrain.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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章