2013-12-17 3 views
3

Я делаюPython __import__ только дает мне модуль верхнего уровня

module = __import__("client.elements.gui.button", globals(), locals(), [], 0) 

Но это только возвращение client.

В чем моя проблема?

+2

Для Python 2.7 или более поздней версии, используйте [ 'importlib.import_module()'] (HTTP: // документы. python.org/2/library/importlib.html#importlib.import_module). –

ответ

3

Принято ответ правильный, но если вы читаете в документации вы увидите, что это может быть удосужился с заведомо тревожным «взломать», используя __import__ так:

module = __import__('client.elements.gui.button', fromlist=['']) 

Это Безразлично» действительно важно, что вы проходите за fromlist, пока это не пустой список. Это сигнализирует о реализации по умолчанию __import__, которую вы хотите импортировать в стиле from x.y.z import foo, и это будет вернуть модуль, который вы используете.

Как указано, вместо этого вы должны использовать importlib, но это все еще обходное решение, если вам необходимо поддерживать версии Python < 2.7.

+0

Действительно интересный и отличный дополнительный ответ. – Drake

2

Он получает только верхний уровень, но вы также можете обойти это так:

module_name = 'some.module.import.class' 
    module = __import__(module_name) 
    for n in module_name.split('.')[1:]: 
     module = getattr(module, n) 

# module is now equal to what would normally 
# have been retrieved where you to properly import the file 
Смежные вопросы