Import einer Datei (als list item)

Code-Stücke können hier veröffentlicht werden.
Antworten
bendixbendix
User
Beiträge: 1
Registriert: Donnerstag 3. Dezember 2020, 15:41

Donnerstag 3. Dezember 2020, 16:08

Moin,
bin Anfänger und versuche mich etwas in Python 😄

Aktuell versuche ich verschiedene Skripte in ein anderes zu importieren.
Ich nutze die Sikuli IDE und habe mehrere Skripte, die in einer immer anderen Reihenfolge importiert und ausgeführt werden sollen.
Ich habe also ein main script von dem aus andere Skripte (im Beispiel Test1, Test2 und Test3) importiert bzw ausgeführt werden sollen.

Das importieren alleine klappt wunderbar, das Erstellen einer unregelmässigen Reihenfolge ebenso, ich bekomme es nur nicht zusammen...
mein Code für eine unregelmässige Reihenfolge sieht so aus:
import random

scriptlist = ['Test1', 'Test2', 'Test3']
print("These are the scripts I want to execute " , scriptlist)
random.shuffle(scriptlist)
print("So I shuffled them to a new order " , scriptlist)
print("then I'll pick always the first of the list to execute it and then remove the first of that list")
print("The first script to take would be " + scriptlist[0])
scriptlist.pop(0)
print("The second script to take would be " + scriptlist[0])
scriptlist.pop(0)
print("The third script to take would be " + scriptlist[0])
Nun würde ich gerne die Listitems importieren, also jeweils das erste der Liste, bevor es für den nächsten Schritt der Liste entnommen wird.

In der Sikuli IDE geht das importieren einer Weiterren Sikuli Datei ganz einfach mittels:
import Test1
Nun bekomme ich es aber nicht hin, dass z.B.
import (scriptlist(0))
die Datei importiert...
Stattdessen bekomme ich immer die Fehlermeldung "invalid syntax".

Hat jemand eine Idee, welchen Fehler ich mache? oder ist das so, wie ich es mir vorstelle garnicht möglich?
Bin ganz neu bei Python, lerne jeden Tag dazu, aber eine Lösung hierfür habe ich noch nicht finden können und wäre total dankbar für Hilfe!

Grüße
Benutzeravatar
__blackjack__
User
Beiträge: 8430
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Donnerstag 3. Dezember 2020, 18:45

@bendixbendix: Erst mal etwas zum gezeigten Quelltext: Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Modulnamen werden klein geschrieben, also "test1", "test2", und so weiter. Wobei das hoffentlich nur Beispiele sind und die tatsächlichen Namen a) besser beschreiben was das Modul enthält und b) nicht nummeriert sind.

Grunddatentypen haben nichts in Namen zu suchen. `scriptlist` sollte also besser `module_names` heissen, denn das enthält die Liste letztlich: Modulnamen.

Das mit dem `pop()` verstehe ich nicht. Warum muss diese extra Arbeit vom Rechner gemacht werden um die Namen aus der Liste zu entfernen? Und dann auch noch so ungünstig vom Anfang der Liste her? Letztlich könnte man doch einfach eine Schleife über die Liste schreiben und sich damit den wiederholten, fast gleichen Code ersparen.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
import random


def main():
    module_names = ["test1", "test2", "test3"]
    print("These are the scripts I want to execute:", module_names)
    random.shuffle(module_names)
    print("So I shuffled them to a new order:", module_names)
    for ordinal, module_name in zip(
        ["first", "second", "third"], module_names
    ):
        print(f"The {ordinal} script to take would be {module_name}")


if __name__ == "__main__":
    main()
Da das mit dem Code auf Modulebene und der `main()` auch für die anderen Module gelten sollte, ist es egal in welcher Reihenfolge man die importiert. Man importiert die einfach und statt einer Liste mit den Modulnamen, erstellt man eine mit den Modulen selbst, mischt die, und ruft dann nacheinander die `main()`-Funktion in jedem der Module auf:

Code: Alles auswählen

#!/usr/bin/env python3
import random

import test1
import test2
import test3


def main():
    modules = [test1, test2, test3]
    print(
        "These are the scripts I want to execute:",
        ", ".join(module.__name__ for module in modules),
    )
    random.shuffle(modules)
    print(
        "So I shuffled them to a new order:",
        ", ".join(module.__name__ for module in modules),
    )
    for ordinal, module in zip(["first", "second", "third"], modules):
        print(f"Executing the {ordinal} program: {module.__name__}")
        module.main()


if __name__ == "__main__":
    main()
“For every complex problem, there is a solution that is simple, neat, and wrong.” — H. L. Mencken
Antworten