@DrCrow: Statt randint()
hätte man randrange()
verwenden können. Oder man spart sich das mit den Indexwerten komplett und mischt die Liste mit der shuffle
-Funktion aus dem random
-Modul. Indexwerte sind in Python eher selten und oft ein Zeichen das man etwas komisches versucht und nicht wirklich in Python programmiert.
os.popen()
ist das falsche Werkzeug. Es gibt das subprocess
-Modul, das all die anderen Möglichkeiten externe Programme zu starten ersetzt und wo man auch keine unnötige zusätzliche Shell zwischen dem Python-Programm und dem was man extern ausführen möchte braucht, womit dann auch die Probleme mit Anführungszeichen, Leerzeichen & Co in den Dateinamen entfallen, weil die nicht noch zwischendurch noch mal von einer Shell interpretiert werden bevor sie dem eigentlichen Programm übergeben werden.
Pfadteile setzt man in Python mit os.path.join()
zusammen und nicht mit +
.
| process = subprocess.Popen(['mpg123', os.path.join(MUSIC_PATH, dateiname)])
|
Den Pfad zu den Musikdateien sollte man nur einmal im Programm stehen haben, am besten als Konstante. Dann kann man den an *einer* Stelle ändern und es besteht auch nicht die Gefahr das man bei Änderungen eine Stelle vergisst oder nicht alle exakt gleich verändert.
Die Namen sind schlecht gewählt und/oder entsprechen nicht den Konventionen unter Python. Ein Name soll dem Leser verraten was der Wert bedeutet. Einbuchstabige Namen tun das in aller Regel nicht. Und auch so etwas wie liste
nicht, denn man möchte ja nicht wissen das es eine Liste ist, sondern was die Werte darin für eine Bedeutung haben. music_filenames
zum Beispiel. Wenn man sinnvolle Namen verwendet, braucht man auch nicht in Kommentaren beschreiben was da passiert, denn das ist dann auch ohne Kommentar in der Regel ersichtlich. Kommentare sollten nicht beschreiben was der Code macht, denn das steht da ja schon als Code, sondern warum der Code das so macht — sofern das nicht offensichtlich ist.
Bei aus mehreren Worten zusammengesetzten Namen verwendet man in Python worte_in_kleinbuchstaben_mit_unterstrichen. Ausgenommen Klassennamen (MixedCase) und Konstanten (KOMPLETT_GROSS).
Wenn man anfängt Namen durchzunummerieren, will man entweder bessere Namen oder gar keine einzelnen Namen sondern eine Datenstruktur wie eine Liste oder in diesem Fall vielleicht auch eine Queue (collections.deque
).
Bei dem while
sind viel zu viele unnötige Klammern. Ausserdem ist das zu umständlich formuliert, denn man könnte auch den in
-Operator verwenden um zu testen ob zufall_titel_nr
in einer Liste oder einem Tupel (oder einer Queue) von Werten enthalten ist. Also beispielsweise:
| while True:
while zufalls_titel in [musik_titel_n1, musik_titel_n2, musik_titel_n3]:
# ...
|
Beziehungsweise wenn man die letzten Werte sowieso schon in einer Sequenzdatenstruktur stehen hat, einfach:
| letzte_titel = deque(maxlen=3)
while True:
while zufalls_titel in letzte_titel:
zufalls_titel = random.choice(musik_dateinamen)
letzte_titel.append(zufalls_titel)
# ...
|
Das Programm bekommt an der Stelle übrigens ein Problem mit einer Endlosschleife wenn es nur drei oder weniger Dateinamen in dem Verzeichnis gibt. Ein Grund mehr warum ich das einfach mit random.shuffle()
auf der Liste mit den Dateinamen lösen würde, also:
| while True:
random.shuffle(musik_dateinamen)
for dateiname in musik_dateinamen:
# ...
|
Du benutzt viel zu oft os.popen()
. Also auch für Fälle wo man das nicht mit dem subprocess
-Modul ersetzt, sondern für Sachen für die es total unsinnig ist eine externe Shell mit einem Kommando zu starten. Beispielweise das Schreiben von einem Dateinamen in eine Datei. Man kann in Python durchaus Dateien öffnen und dort etwas hineinschreiben. Dazu muss man keine Shell starten die das dann mit echo
und einer Umleitung in eine Datei macht. Wobei Dir auch hier wieder (unnötigerweise) Probleme durch Zeichen in den Musik-Dateinamen entstehen können, weil das ja an der Shell vorbei muss.
Ich würde das ganze generell nicht wirklich als Python-Programm sehen, denn Python wird dort kaum tatsächlich verwendet. Das ist eher ein als Python verkleidetes Shell-Skript.