Verschiedene Scripte von einem Hauptscript aus aufrufen

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
Cerberus
User
Beiträge: 4
Registriert: Dienstag 5. Juni 2018, 09:59

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
Benutzeravatar
__blackjack__
User
Beiträge: 14032
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Cerberus
User
Beiträge: 4
Registriert: Dienstag 5. Juni 2018, 09:59

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14032
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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()
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Cerberus
User
Beiträge: 4
Registriert: Dienstag 5. Juni 2018, 09:59

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
Antworten