Python 筆記:Package Import, Absolute & Relative

一直被 import 搞的頭暈眼花不是辦法,筆記一下:

Import 分成 absolute path, relative path 兩種

  1. absolute path 如同 Java package,使用 fully-qualified name 指定,搜尋時從 sys.path 尋找完整的套件名稱
  2. relative path 如同檔案、URI 相對路徑,由 "." 或是 ".." 起始,搜尋相對於目前模組位置的套件
  3. PEP-8 過去曾反對使用相對路徑,因為當時版本效能不好,目前已修正,承認相對路徑在專案開發時,有許多的好處,也是可以接受的作法

Import 的搜尋路徑

  1. import 指令搜尋路徑,最簡單的想法是搜尋 sys.path
  2. sys.path 會包含 command line 指令中,腳本所在目錄:
    • 例如:working_dir$ /path/to/script/filename.py,那就包含 working_dir/path/to/script
    • 但是不會包含 working_dir
  3. sys.path 也會包含 PYTHON_PATH 這環境變數
  4. 有些 IDE,如:Eclipse,會將專案根目錄,加到 PYTHON_PATH 中,或是修改腳本啟動的工作目錄,要注意

個人短評

  • 套件內部使用相對路徑匯入模組,很大的好處是套件可以在專案中任意搬動
  • 但是匯入其他外部套件、模組時,如果也是使用相對路徑,自己的套件搬動就會遇到大問題
  • 或許比較好的方式是:相同套件模組用相對路徑,其他套件模組用一個絕對路徑引用、重新命名(import ... as ...),再從該套件引用模組
  • 可以利用 __init__.py,將套件內部實作抽象化,避免直接引用外部套件的絕對路徑

參考

  1. https://stackoverflow.com/a/5811548/1825443
  2. https://chrisyeh96.github.io/2017/08/08/definitive-guide-python-imports.html#summary--key-points








留言

這個網誌中的熱門文章

[開箱] 老公寓的舒適親子大空間

論文筆記:Data Distillation: Towards Omni-Supervised Learning

平淡的結紮經驗談