Python Import System

How python’s import machinery works 簡單的筆記, 順便整理一下 import 的資料。

概述

import 就像 C的 include …用來引用其他的程式庫。 並簡單說明引用的機制、優先順序。

名詞解釋

modules:

A module is a file containing Python definitions and statements.

modules 是有 python 程式碼的檔案, 是單一檔案,副檔名是 .py,檔案名就是 import name

packages:

a way of structuring Python’s module namespace by using “dotted module names”.

packagesmodules 的集合,import name 通常是 資料夾名。

範例檔案結構

假設有個 package 長這樣

tmp/
  my_package/
    __init__.py
    my_module.py

my_module.py

class MyClass:
    def __init__(self):
        print('init called')

    def caps(self, word):
        print(word.upper())

import 方法一

tmp後,執行 python

$cd tmp
$python

通常 import 的方式是這樣。 物件產生時,和物件方法執行時,會印出一些訊息。

>>> from my_package import my_module
>>> something = my_module.MyClass()
init  called
>>> something.caps('hello')
HELLO

import 方法二:import_module 動態載入

先載入 import_module 後,再用它載入其他的 package

>>> from importlib import import_module
>>>
>>> my_module = import_module('my_package.my_module')
>>> obj = my_module.MyClass()
init called
>>> obj.caps('hello')
HELLO

手動載入

How to import a module given the full path?

Python module 的載入機制

sys.modules 先找

  • sys.modules 是 python 執行時會先載入的 module,通常是系統內建的程式庫
  • 如果你有把 import my_module , my_module 也會出現在 sys.modules 中。

sys.meta_path 次之

前面的 sys.modules 找不到後,會載入 sys.meta_path 物件,開始從 sys.path 裡去找你想載入的 packages。

這邊比較需要記得就是 sys.path 是放要載入的程式庫的路徑, 所以把你的程式庫路徑加進 sys.path 應該就可以找到了。

其他

整個 import 載入的機制,參考連結說的滿清楚的的, 太細節的部分,之後有空再來細看。

參考連結

  1. Python Docs: 5.The import system
  2. How python’s import machinery works
  3. import-pypi:import modules form pypi
  4. StockOverFlow:What’s the difference between a Python module and a Python package?