Найти - Пользователи
Полная версия: Динамический импорт модулей
Начало » Python для экспертов » Динамический импорт модулей
1
mks
Добрый день.
Подскажите можно ли с помощю функции __import__ или модуля imp реализовать динамическую конструкцию вида:
module_name = 'some_module'
from module_name import *
Тоесть имя модуля извесно только во время исполнения.
Спасибо.
Андрей Светлов
from importlib import import_module
mod = import_module(module_name)
globals().update({k: getattr(mod, k) for k in mod.__all__})
Fibio
Андрей Светлов
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)
Андрей Светлов

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

andreypaa
Тоже понадобилось решение данного вопроса …
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
Kyrym
Андрей Светлов
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
Вопрос решил иначе:
Главный файл:
 # 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]
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB