Python code sperren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Marvin75854

Hallo,

also ich habe ein Programm geschrieben was durch einige Eingaben auf einer GUI verschiedene Dinge berechnet. Jetzt soll die Möglichkeit bestehen, dass man in einem Modul direkt im Code ein paar Werte verändert um das Programm quasi zu kalibrieren. Ich weiß natürlich wie das funktioniert und werde auch eine Anleitung schreiben, der Anwender weiß das ohne die Anleitung logischerweise aber nicht. Ich will irgendwie verhindern, dass der Anwender auch andere Dinge in anderen Programmteilen versehentlich verändert. Mein Programm besteht aus 3 Modulen. Besteht irgendwie die Möglichkeit, dass ich 2 Module davon für die Bearbeitung komplett sperre? Oder, dass ggf. bei allen Modulen erst eine Passwort Abfrage oder ähnliches durchgeführt wird? Ich gehe mal stark davon aus, dass man sowas nicht direkt aus dem Code heraus machen kann, da er beim editieren ja gar nicht ausgeführt wird. Kennt da trotzdem jemand eine Möglichkeit? Ich arbeite unter Linux.

Gruß
Marvin
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Warum speicherst du konfigurierbare Daten nicht einfach in einer Konfigurationsdatei?
Marvin75854

/me hat geschrieben: Freitag 31. August 2018, 13:40 Warum speicherst du konfigurierbare Daten nicht einfach in einer Konfigurationsdatei?
Was genau meinst du mit Konfigurationsdatei? Einfach eine Datei nur mit den anzupassenden Zahlenwerten?
Ich habe mich da falsch ausgedrückt. Also das kalibrieren ist eine Sache die wahrscheinlich zu 100% vorgenommen werden muss. Es kann aber auch sein, dass eine neue Subklasse hinzugefügt werden muss und dictionaries angepasst werden müssen usw. Deshalb habe ich alles was ggf. angepasst werden muss in ein extra Modul geschrieben. Das sind auch schon über 350 Zeilen.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Marvin75854 hat geschrieben: Freitag 31. August 2018, 14:01 Es kann aber auch sein, dass eine neue Subklasse hinzugefügt werden muss und dictionaries angepasst werden müssen usw.
Grundsätzlich ist es kein Problem, die Inhalte von Dictionaries konfigurierbar abzulegen.

Jetzt erwähnst du aber noch die Erstellung von neuen Klassen. In dem Fall solltest du es mit einer fachlich vorgebildeten Zielgruppe zu tun haben, die weiß was sie da tut. Auf der anderen Seite stellt sich natürlich die Frage, warum tatsächlich ein Eingriff in den Code erforderlich ist. Dazu gibt es zwei Ansätze. Entweder lässt sich dein Problem auch ohne die neue Klasse lösen oder du erstellst die Klasse dynamisch aus dem Code heraus.
Marvin75854

/me hat geschrieben: Freitag 31. August 2018, 14:13 Grundsätzlich ist es kein Problem, die Inhalte von Dictionaries konfigurierbar abzulegen.

Jetzt erwähnst du aber noch die Erstellung von neuen Klassen. In dem Fall solltest du es mit einer fachlich vorgebildeten Zielgruppe zu tun haben, die weiß was sie da tut. Auf der anderen Seite stellt sich natürlich die Frage, warum tatsächlich ein Eingriff in den Code erforderlich ist. Dazu gibt es zwei Ansätze. Entweder lässt sich dein Problem auch ohne die neue Klasse lösen oder du erstellst die Klasse dynamisch aus dem Code heraus.
Also es sind alles Ingenieure. Da hatte wohl jeder mal eine Vorlesung im Programmieren. Ich habe aber mit Python z.b. vor ca. 1,5 Monaten auch komplett bei 0 gestartet. Das Programm funktioniert so wie es ist perfekt. Wenn eine Subklasse hinzugefügt wird, muss eine oder mehrere Dictionaries und Listen für Dropdown menüs angepasst werden. Das heißt es kann die neue Klasse über die GUI auch ausgewählt werden und wird dann in einem anderen Modul über die Dictionaries automatisch für Berechnungen usw. verwendet.
Also es geht hier um ein Tool was im Bereich Crashberechnung verwendet wird. Es sind einige Dummys und Lastfälle in Klassen definiert und es kann später dazu kommen, dass da noch neue hinzugefügt werden müssen.
Marvin75854

Also, wenn es da keine so leicht umzusetzende Möglichkeit gibt, wäre das jetzt auch nicht weiter schlimm. Das war auch von niemanden so gefordert. Nur macht mir Programmieren mittlerweile tatsächlich ein bisschen Spaß. Ich probiere eine ganze Menge rum und dachte das wäre ganz nett, wenn man sowas irgendwie umsetzen könnte.
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Marvin75854: Das Programm selbst zu verändern ist der falsche Weg. Das was Du möchtest nennt sich gemeinhin „Plugin“ und das kann man lösen ohne das das Programm sich selbst verändert. Bei statisch kompilierten Programmen wo der Benutzer nicht zwingend einen Compiler hat, *muss* man das ja sogar lösen ohne das das Programm selbst geändert wird.

Eine einfache Lösung wäre ein Verzeichnis in dem Benutzer dann ein Unterverzeichnis für ihr Plugin erstellen und das Programm geht dann alle Unterverzeichnisse dort durch und importiert ein Modul mit einem festen Namen, das eine definierte Schnittstelle hat, über die es dann die entsprechenden Funktionen, Klassen, und andere Daten bekommt, die nötig sind um das ganze in das Programm zu integrieren.

Dann kannst Du ein einfaches Beispiel erstellen, oder vielleicht sogar die vorhandenen Dummies und Lastfälle als Plugins dort ablegen, so das der Benutzer eine Vorlagen hat, an der er sich orientieren kann.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Marvin75854

__blackjack__ hat geschrieben: Samstag 1. September 2018, 11:32 @Marvin75854: Das Programm selbst zu verändern ist der falsche Weg. Das was Du möchtest nennt sich gemeinhin „Plugin“ und das kann man lösen ohne das das Programm sich selbst verändert. Bei statisch kompilierten Programmen wo der Benutzer nicht zwingend einen Compiler hat, *muss* man das ja sogar lösen ohne das das Programm selbst geändert wird.

Eine einfache Lösung wäre ein Verzeichnis in dem Benutzer dann ein Unterverzeichnis für ihr Plugin erstellen und das Programm geht dann alle Unterverzeichnisse dort durch und importiert ein Modul mit einem festen Namen, das eine definierte Schnittstelle hat, über die es dann die entsprechenden Funktionen, Klassen, und andere Daten bekommt, die nötig sind um das ganze in das Programm zu integrieren.

Dann kannst Du ein einfaches Beispiel erstellen, oder vielleicht sogar die vorhandenen Dummies und Lastfälle als Plugins dort ablegen, so das der Benutzer eine Vorlagen hat, an der er sich orientieren kann.
Ok, ja das klingt natürlich wesentlich sinnvoller. Weißt du vielleicht wo es dazu eine anständige Erklärung gibt? Ich habe jetzt beim googlen nicht wirklich gefunden was mich weiterbringt. Es war auch oft die rede von einem Pluginmanager oder so. Sowas kann ich hier halt alles nicht installieren.

Klingt aber doch sehr zeitaufwändig. Ich weiß nicht, ob ich das überhaupt noch umsetzen kann.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ein Plugin in Python ist wenig mehr als eine Reihe von Vereinbarungen. Zb wo sie gesucht werden (zentraler Ordner, User-spezifischer Ordner). Sowie die Erwartung an ihre Gestalt. Muss es da immer eine Funktion drin geben die auf bestimmte Art heißt & dann aufgerufen wird. Oder Namen für Datenstrukturen. Etc.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich benutze für Plugins normalerweise Dekoratoren, ala `@register_class`.

@Marvin75854: Laden von Plugins geht, z.B. so (How to load all modules in a folder?):

Code: Alles auswählen

import pkgutil

def load_all_modules_from_package(packagename):
    for importer, modulename, _ in pkgutil.iter_modules([packagename]):
        full_modulename = '%s.%s' % (packagename, modulename)
        importer.find_module(modulename).load_module(full_modulename)

load_all_modules_from_package('plugins')
Antworten