Python 動態加載模組小記錄


在做實驗性的玩具.遇上了這個問題.
英文好像是 Dynamic Import Module?.
不過加載是否成功.對應的位置很重要.
筆記一下

大約結構如下:

1
2
3
app/socials/__init__.py
app/socials/provider/__init__.py
app/socials/provider/facebook.py

在 app/socials/init.py 內容為:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 應用 provider = import_provider('facebook')
def import_provider(name):
module = __import__("provider.{0}".format(name), globals(), locals(), [str(name)])
return getattr(module, name.capitalize())

# 簡化一下
import_provider = lambda name: getattr(__import__("provider.{0}".format(name), globals(), locals(), [str(name)]), name.capitalize())

# 找出源碼位置直接加載進來
def import_provider(name):
socials_root = dirname(abspath(__file__))
provider_root = join(socials_root, 'provider')
provider_source = join(provider_root, name + '.py')
provider_module = load_module(
# convert path sep from "/" to "."
splitext(provider_source)[0].replace(sep, '.'),
*find_module(name, [provider_root])
)
return getattr(provider_module, name.capitalize())