Форум сайта python.su
Добрый день.
Подскажите можно ли с помощю функции __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__})
Офлайн
Андрей Светлов
from importlib import import_module
mod = import_module(module_name)
globals().update({k: getattr(mod, k) for k in mod.__all__})
Офлайн
«Или» — не катит если module_name с точками внутри. Если советуете — то приводите полные примеры.
Офлайн
Тоже понадобилось решение данного вопроса …
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
Офлайн
Андрей СветловПочему-то не получается этот вариант.
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)
Офлайн
Вопрос решил иначе:
Главный файл:
# 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_())
p = ['few','efwg']
p = [2,234,214]
Офлайн