Ich entwickle einen Slack-Bot mit Plugins mit Einstiegspunkten. Ich möchte während der Laufzeit ein Plugin dynamisch hinzufügen.Wie können Einstiegspunkte dynamisch hinzugefügt und geladen werden?
Ich habe ein Projekt mit dieser Struktur:
+ ~/my_project_dir/
+ my_projects_python_code/
+ plugins/
- plugin1.py
- plugin2.py
- ...
- pluginN.py
- setup.py
- venv/
- install.sh
Meine setup.py
Datei sieht wie folgt aus:
from setuptools import setup, find_packages
setup(
name="My_Project_plugins",
version="1.0",
packages=['plugins'],
entry_points="""
[my_project.plugins]
plugin1 = plugins.plugin1:plugin1_class
plugin2 = plugins.plugin2:plugin2_class
...
pluginN = plugins.pluginN:pluginN_class
"""
)
sudo install.sh
Laufen macht folgendes:
Kopiert die benötigten Dateien zu
/usr/share/my_project_dir/
aktivieren virtualenv bei
/usr/share/my_project_dir/venv/bin/activate
Run:
python setup.py develop
Dies funktioniert wie erwartet und setzt meine Einstiegspunkte richtig so, dass ich sie durch den Bot nutzen können.
Aber ich möchte ein Plugin zu setup.py
hinzufügen und in der Lage sein, es zu verwenden, während der Bot ausgeführt wird. Also ich möchte eine Zeile hinzufügen: pluginN+1 = plugins.pluginN+1:pluginN+1_class
und haben pluginN + 1 verfügbar zu verwenden.
Was ich versucht habe/gelernt:
Nach
/usr/share/my_project_dir/venv/bin/activate
ich eine interaktive Python-Shell öffnen und durchlaufenpkg_resources.iter_entry_points()
, die alles auflistet, die von dem Anfangszustand von setup.py geladen wurde (dh plugin1 durch Pluginn)wenn ich eine Linie zu
setup.py
und laufensudo python setup.py develop
und iterieren wieder mit der gleichen Python-Shell hinzufügen, ist es nicht das neue Plugin abholen, aber wenn ich die Shell verlassen und wieder öffnen, wird das neue Plugin gepflückt oben.Ich habe bemerkt, dass, wenn ich den Bot installiert haben, einen Teil des Ausgangs sagt:
Copying My_Project_plugins-1.0-py2.7.egg to /usr/share/my_project-dir/venv/lib/python2.7/site-packages
Als ich
cd /usr/share/my_project_dir/
, mein virtualenv aktivieren, und führen Siesetup.py
von der Shell sagt es :Creating /usr/local/lib/python2.7/dist-packages/My_Project-plugins.egg-link (link to .) My_Project-plugins 1.0 is already the active version in easy-install.pth
Wenn Sie mehrere Plugins für ein gemeinsames Programm haben, macht etwas wie "pip install", "pip uninstall", "pip search" eine unerwünschte Wahl? –
Das Ziel ist, dass der Bot Plugins während der Laufzeit über eine Leermeldung installiert. Also muss es dynamisch aktualisiert werden und jedes dieser Plugins wird proprietär sein. –
Können Sie näher beschreiben, wie es funktioniert? 1. Bot bekommt Befehl, ein Plugin zu installieren? Was ist "installieren"? Sollte der Bot diese Datei herunterladen oder kopieren? Oder muss es nur eine Funktion von bereits vorhandener Datei aufrufen? 2. Bot ruft eine Funktion auf oder muss ein Skript starten? Wie? –