Seite 1 von 1

Verschiedene Scripte von einem Hauptscript aus aufrufen

Verfasst: Dienstag 5. Juni 2018, 10:25
von Cerberus
Hallo,

ich bin leider ziemlicher python Neuling und habe folgendes Problem.
Ich habe mehrere Schnittstellen zur Verarbeitung von verschiedenen Daten, jede davon ist eine einzelne .py Datei.
Außerdem eine ini in der ich hinterlegen möchte um welche Schnittstelle es sich gerade handelt.
In etwa so:
[switch]
schnittstelle=? , hier dann zb 1 für x, 2 für y etc

Auslesen kann ich die ini, auch wenn ich noch nicht zu 100% testen konnte ob auch das richtige passiert.
Nun meine eigentliche Frage:
Ich möchte eine Art Hauptscript haben in dem dann die anderen Scripte aufgerufen werden.
Dort befindet sich die Funktion zum ini-Auslesen und wenn eine 1 übergeben wird soll x() gestartet werden. Bei 2 y(), usw. (über if hab ich das im Moment).
Beispiel:

Code: Alles auswählen

def switch():
	conf.read(ini)

	test = conf.get('switch', 'schnittstelle')
	if test == 1:
		x()
	elif test == 5:
		y()
Aber wie kann ich dieses Script dann starten? Ich möchte am ende eine einzige .exe und die ini soll ohne nochmaliges exe kompilieren verändert werden können. Ich muss dem also einmal alles mitgeben was da ist und später wird unterschieden.

Ist das so in etwa möglich wie ich das beschreibe?

Vielen Dank

Re: Verschiedene Scripte von einem Hauptscript aus aufrufen

Verfasst: Dienstag 5. Juni 2018, 10:51
von __blackjack__
Ich sehe hier jetzt gerade kein Problem das zu lösen wäre? Was funktioniert denn an Deinem Code nicht? Also ausser dass das `get()` Zeichenketten liefern wird die man nicht sinnvoll mit Zahlen vergleichen kann. Es währe vielleicht auch besser keine Zahlen zu wählen sondern beschreibendere Namen für die Schnittstellen.

Wo kommt `conf` her? Und `ini`? Variablen sollten nicht einfach so magisch aus dem nichts kommen. Alles was eine Funktion oder Methode braucht (ausser Konstanten) sollte als Argumente übergeben werden. Namen für Konstanten werden per Konvention komplett in Grossbuchstaben geschrieben.

Anstelle einer `if`/`elif`-Kaskade könnte man auch mit einem Wörterbuch arbeiten das die Zahlen/Beschreibungen auf die Funktionen abbildet.

Re: Verschiedene Scripte von einem Hauptscript aus aufrufen

Verfasst: Dienstag 5. Juni 2018, 11:12
von Cerberus
Ich hatte es etwas verkürzt dargestellt.

Code: Alles auswählen

def switch():
	config = SafeConfigParser()
	config.read('config.ini')

	data = config.get('switch', 'schnittstelle')
	if data == kidi:
		kidi()
	elif data == pui:
		pui()
Also so wäre das besser?
Natürlich unter der Vorraussetzung das ich auch in der ini dann zb schnittstelle=kidi sage.
Mein Problem ist das ich nicht genau weiß wie ich dann das script kidi.py starten kann wenn in der ini kidi steht.

Re: Verschiedene Scripte von einem Hauptscript aus aufrufen

Verfasst: Dienstag 5. Juni 2018, 12:08
von __blackjack__
Du willst eigentlich nicht Skripte starten sondern die entsprechende Funktion aufrufen. Also beispielsweise `import kidi` schreiben und dann später `kidi.main()` aufrufen, wenn die Hauptfunktion dort `main()` heisst. Also ungefähr so:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8
from __future__ import absolute_import, division, print_function
from ConfigParser import SafeConfigParser

import kidi
import pui

API_NAME_TO_MODULE = {
    'kidi': kidi,
    'pui': pui,
}


def main():
    config = SafeConfigParser()
    config.read('config.ini')

    api_module = API_NAME_TO_MODULE.get(config.get('switch', 'schnittstelle'))
    getattr(api_module, 'main')()


if __name__ == '__main__':
    main()

Re: Verschiedene Scripte von einem Hauptscript aus aufrufen

Verfasst: Freitag 8. Juni 2018, 10:57
von Cerberus
Vielen Dank.

Hab es mal so umgebaut wie du es vorgeschlagen hast. In den einzelnen Scripten heißen sie auch main(), die wird aber leider nicht aufgerufen.
Hab mir ganz oben in die main der Schnittstelle mal ein print gesetzt um zu sehen ob er reinspringt aber er gibt nichts aus.
Wenn ich die exe erstelle bin ich mir aber relativ sicher das er alles richtig durch geht.

Code: Alles auswählen

def main():
	print "Startest du?"
        prog = "pui2cm.exe"
        op = ArgumentParser(usage="usage: %(prog)s [Options]",
                         version="%(prog)s "+VERSION,
Habe mir auch mal ein print gemacht ob die ini richtig gelesen wird. Das ist alles korrekt.

edit: muss nochmal testen, habe glaube ich einen fehler gemacht