2013-02-07 83 views
0

我需要動態地導入模塊並創建一個類。
這是在Python 3.2我的工作代碼:python動態模塊導入(代碼從3.2到3.3)

klass = {} 
mod = __import__('sites.' + self.className + '_login', fromlist=[self.className]) 
klass[self.className] = getattr(mod, self.className) 
klass[self.className](**self.args) 

該模塊是「地王」文件夾內。它被稱爲my_site_login和該模塊「my_site」中的類。

由於我升級到Python 3.3,代碼停止工作。我讀了_____import_____被importlib.import_module替換。我嘗試了幾種方法來做到這一點,但我無法實現。

這是我的嘗試:
https://stackoverflow.com/a/8790051/1095101

mod = getattr(import_module('sites.' + self.className + '_login'), self.className) 

我不記得還有什麼我已經試過。我能說的是,沒有任何印刷()我在任何導入嘗試後立即顯示。我沒有收到任何錯誤消息。它只是注意到。

對不起,我知道它已經被回答了幾次,但我試了一切,沒有任何工作。我再也想不起來了。 謝謝先進。

回答

1

你想重組這個;在sites__init__.py文件中,導入全部需要動態導入的模塊。

然後,只需使用屬性訪問而不是:

import sites 

mod = getattr(sites, self.className + '_login') 
klass[self.className] = getattr(mod, self.className) 
klass[self.className](**self.args) 

如果您my_site_login.py模塊是動態生成的,該importlib.import_module()可調用的工作很簡單:

importlib 

mod = importlib.import_module('sites.{}_login'.format(self.className)) 
klass[self.className] = getattr(mod, self.className) 
klass[self.className](**self.args) 

從交互式命令提示符這工作得很好:

>>> import importlib 
>>> importlib.import_module('sites.my_site_login') 
<module 'sites.my_site_login' from './sites/my_site_login.py'> 

經過測試,我Python 2.7,3.2和3.3。

+0

好的...這很尷尬。由於你的代碼正是我所嘗試的,所以有些事情是不對的。問題出在模塊的新文檔中。沒有utf-8聲明,有些人物搞砸了一切。無論如何,我會用你的第二個代碼,它們是動態生成的。謝謝。 –