Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 26, 2012 16:59:10

mks
От:
Зарегистрирован: 2009-08-07
Сообщения: 80
Репутация: +  5  -
Профиль   Отправить e-mail  

Динамический импорт модулей

Добрый день.
Подскажите можно ли с помощю функции __import__ или модуля imp реализовать динамическую конструкцию вида:

module_name = 'some_module'
from module_name import *
Тоесть имя модуля извесно только во время исполнения.
Спасибо.



Офлайн

#2 Сен. 26, 2012 18:02:46

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Динамический импорт модулей

from importlib import import_module
mod = import_module(module_name)
globals().update({k: getattr(mod, k) for k in mod.__all__})



Офлайн

#3 Сен. 27, 2012 13:20:56

Fibio
От:
Зарегистрирован: 2010-09-14
Сообщения: 74
Репутация: +  2  -
Профиль   Отправить e-mail  

Динамический импорт модулей

Андрей Светлов
from importlib import import_module
mod = import_module(module_name)
globals().update({k: getattr(mod, k) for k in mod.__all__})

или mod = __import__(module_name)



Офлайн

#4 Сен. 27, 2012 17:12:50

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Динамический импорт модулей

«Или» — не катит если module_name с точками внутри. Если советуете — то приводите полные примеры.



Офлайн

#5 Окт. 16, 2012 22:24:01

andreypaa
Зарегистрирован: 2012-10-16
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамический импорт модулей

Тоже понадобилось решение данного вопроса …
importlib удобен если версия питона 2.7+
для младших версий нашел норм решение вот тут http://stackoverflow.com/questions/452969/does-python-have-an-equivalent-to-java-class-forname

приведу необходимую функцию

def get_class( kls ):
    parts = kls.split('.')
    module = ".".join(parts[:-1])
    m = __import__( module )
    for comp in parts[1:]:
        m = getattr(m, comp)            
    return m
этой функции необходимо передать полный пусть с точками непосредственно до необходимого класса
и использовать можно так:
m = get_class("module.module.class")
a = m() #instantiate a new instance of the class    
b = m( arg1, arg2 ) # pass arguments to the constructor

Офлайн

#6 Дек. 4, 2017 11:29:03

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

Динамический импорт модулей

Андрей Светлов
from importlib import import_module
mod = import_module(module_name)
globals().update({k: getattr(mod, k) for k in mod.__all__})
Почему-то не получается этот вариант.
 # Python 3
# -*- coding: utf-8 -*-
import sys, importlib
from PyQt4 import QtCore, QtGui
from PyQt4.QtGui import (QWidget, qApp, QAction, QApplication, QHBoxLayout, QVBoxLayout,
                             QGridLayout, QLabel, QLineEdit, QTextEdit, QPushButton, QComboBox,
                             QCheckBox, QRadioButton, QFrame, QScrollArea, QTabWidget, QSizePolicy,
                             QGroupBox, QFileDialog)
from PyQt4.QtGui import QIcon, QPixmap, QPalette, QTextCursor
from PyQt4.QtCore import QSize
# ЦВЕТА ПОЛЕЙ
sss_vivod = ("background-color: #456173; color: #f2f2f0; font: 14pt 'Courier New'")
# ГРАФИКА
class Window(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.resize(200, 400) # шир / выс окна
        self.setWindowTitle('Заголовок') # Заголовок
        
        # БЛОК РАЗМЕТКИ
        self.vbox = QtGui.QVBoxLayout()
        # ---
        self.pole_vivod = QtGui.QTextEdit('')
        self.pole_vivod.setStyleSheet(sss_vivod)
        self.vbox.addWidget(self.pole_vivod)
        # ---
        self.box = QComboBox()
        self.box.addItems(['a','b1'])
        self.box.activated[str].connect(self.on_start)
        self.vbox.addWidget(self.box)
        # ---
        self.setLayout(self.vbox)
        # ---
        Window.on_start(self)
    # ЛОГИКА
    
    def on_start(self):
        name_modul = self.box.currentText()
        print('name_modul = ',name_modul)
        #import name_modul
        #importlib.import_module('name_modul')
        from importlib import import_module
        mod = import_module(name_modul)
        globals().update({k: getattr(mod, k) for k in mod.__all__})
        '''module = importlib.import_module('name_modul') # math
        globals().update(
            {n: getattr(module, n) for n in module.__all__} if hasattr(module, '__all__')
            else
            {k: v for (k, v) in module.__dict__.items() if not k.startswith('_')
            })'''
# КОНЕЦ
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()   
    window.show() # запускает окно
    sys.exit(app.exec_())
    

Выдаёт ошибку:
 line 53, in on_start
    globals().update({k: getattr(mod, k) for k in mod.__all__})
AttributeError: module 'a' has no attribute '__all__'

Отредактировано Kyrym (Дек. 10, 2017 14:45:22)

Офлайн

#7 Дек. 10, 2017 14:45:28

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

Динамический импорт модулей

Вопрос решил иначе:
Главный файл:

 # Python 3
# -*- coding: utf-8 -*-
import sys, importlib
from PyQt4 import QtCore, QtGui
from PyQt4.QtGui import (QWidget, qApp, QAction, QApplication, QHBoxLayout, QVBoxLayout,
                             QGridLayout, QLabel, QLineEdit, QTextEdit, QPushButton, QComboBox,
                             QCheckBox, QRadioButton, QFrame, QScrollArea, QTabWidget, QSizePolicy,
                             QGroupBox, QFileDialog)
from PyQt4.QtGui import QIcon, QPixmap, QPalette, QTextCursor
from PyQt4.QtCore import QSize
# ЦВЕТА ПОЛЕЙ
sss_vivod = ("background-color: #456173; color: #f2f2f0; font: 14pt 'Courier New'")
def dynamic_import(module):
    return importlib.import_module(module)
# ГРАФИКА
class Window(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.resize(300, 200) # шир / выс окна
        self.setWindowTitle('Заголовок') # Заголовок
        
        # БЛОК РАЗМЕТКИ
        self.vbox = QtGui.QVBoxLayout()
        # ---
        self.pole_vivod = QtGui.QTextEdit('')
        self.pole_vivod.setStyleSheet(sss_vivod)
        self.vbox.addWidget(self.pole_vivod)
        # ---
        self.box = QComboBox()
        self.box.addItems(['a','b1'])
        self.box.activated[str].connect(self.on_start)
        self.vbox.addWidget(self.box)
        # ---
        self.setLayout(self.vbox)
        # ---
        Window.on_start(self)
    # ЛОГИКА
    def on_start(self):
        name_modul = self.box.currentText()
        # print('name_modul = ',name_modul)
        mod = dynamic_import(name_modul)
        #print(mod.p)
        self.pole_vivod.setText(str(mod.p))
# КОНЕЦ
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()   
    window.show() # запускает окно
    sys.exit(app.exec_())
    
Файл a.py:
 p = ['few','efwg']
Файл b1.py:
 p = [2,234,214]

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version