[PYTHON] Pensez à quelque chose comme une importation dynamique de système de plug-in-

Il existe un système "plug-in" pour ajouter des fonctions dans Maya et Photoshop, C'est un mémo que je peux fournir une telle chose dans mon propre outil.

importlib

Plus précisément, utilisez le module "import lib".

En passant ** nom du module ** sous forme de chaîne à la fonction "import_module" de ce module

import hogehoge

Vous pouvez importer des modules quelle que soit la manière dont ils sont écrits. Puisqu'il reçoit une chaîne de caractères, il semble que vous puissiez importer le module que vous avez trouvé en le saisissant à tout moment.

Seul ** import_module ** est utilisé, alors importez-le et utilisez-le comme ceci.

from importlib import import_module

(La fréquence d'apparition de l'importation de la chaîne de caractères ...)

Point d'accrochage

1: Essayez de passer avec une passe absolue

J'ai mal compris que je passais un fichier Python, alors je l'ai écrit comme ça.

pluginPath = 'path/to/plugin'

for plugin in os.listdir(pluginPath):
    mod_path = os.path.join(pluginPath,plugin)
    mod = import_module(mod_path,)

C'était mauvais. Passez le nom du module. Aussi, pour cela, l'emplacement où le fichier Python pour le plug est placé Doit être ajouté à sys.path.append. De plus, l'extension du fichier Python trouvé doit être supprimée. Seul le nom du module est transmis.

pluginPath = 'path/to/plugin'
sys.path.append(pluginPath)

for plugin in os.listdir(pluginPath):
    mod_name = os.path.splitext(plugin)[0]
    mod = import_module(mod_name,)

Vous pouvez maintenant ajouter le fichier Python à votre dossier plugins et il sera importé.

2: pyc se met en travers du chemin

Maintenant, il importe, Si vous pouvez l'importer, vous pouvez créer pyc. Je ne veux pas que vous le lisiez.

#Omission

for plugin in os.listdir(pluginPath):
    split_name = os.path.splitext(plugin)
    if split_name[1] == '.pyc':
        continue
    mod = import_module(split_name[0],)

Augmentez le nombre de boutons par le nombre de plug-ins trouvés

Après cela, arrangez autant de boutons que vous trouvez.

spécifications de plugin.py

Ce n'est pas une spécification, mais Nous promettons à l'avance la fonction d'utiliser la fonction du plug-in. Vous pouvez penser à «exec», «doIt» ou «run».

Aussi, ayons l'étiquette sur le bouton du module.

plugin.py



LABEL = 'create poly sphere'

"""
some your scripts...
"""

def exec():
    pass

# or

def doIt():
    pass

# or

def run():
    pass

#-----------------------------------------------------------------------------
# EOF
#-----------------------------------------------------------------------------

Connectez module_name.exec (etc.) au bouton

Connexion au bouton

Créez un QPushButton et passez la fonction d'exécution que vous avez décidé précédemment à .clicked.connect.

btn = QtGui.QPushButton( mod.LABEL )
btn.clicked.connect(mod.exec)

Ajoutez ceci à l'instruction for lisant le module.

Résumé

import os
import sys

from PySide import QtCore, QtGui
from importlib import import_module

pluginPath = 'path/to/plugin'
sys.path.append(pluginPath)

for plugin in os.listdir(pluginPath):
    split_name = os.path.splitext(plugin)
    if split_name[1] == '.pyc':
        continue
    mod = import_module(split_name[0],)

    btn = QtGui.QPushButton( mod.LABEL )
    btn.clicked.connect(mod.exec)

Vous pouvez mettre quelque chose comme ça quelque part dans le script qui crée l'interface graphique.

Après tout, ça a pris le plus de temps Quand j'ai essayé de passer le chemin absolu vers import_module, je gémissais "Je ne peux pas passer" C'était à peu près quand j'ai tapé ~~ et le plugin comme ** pluing ** ...

Lisez attentivement la documentation!


Cliquez ici pour la partie GUI

référence?

--Premier plug-in Maya Python http://help.autodesk.com/view/MAYAUL/2017/JPN/?guid=__files_GUID_B968733D_B288_4DAF_9685_4676DC3E4E94_1_htm

Recommended Posts

Pensez à quelque chose comme une importation dynamique de système de plug-in-
À propos de l'importation
Pensez aux abandons avec MNIST