Idee für Durchlauf einer Liste

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
avenger77
User
Beiträge: 1
Registriert: Samstag 20. März 2021, 22:20

Hallo,

gleich vorweg: Seit heute Morgen habe ich das Pythonfieber. Hatte zuvor nie was mit Programmierung am Hut gehabt. Bin über ein Tutorial auf Youtube auf den Geschmack gekommen. Relativ schnell kam die Idee ein Installationscript in Python für eine Software zu schreiben. Gerade hänge ich wo ich eine Datei auf Einträge prüfen will, ob sie gesetzt sind und im Falle "false" sie dann setze.

Ich habe mich durchgemüht und das hier mir zusammengeschrieben:

Code: Alles auswählen

_sysctlconflist = ["net.ipv4.ip_forward = 0\n", "net.ipv6.conf.all.forwarding = 0\n", "net.ipv4.conf.all.send_redirects = 0\n"]
for i in _sysctlconflist:
    with open("sysctl.conf") as read_object:
        if _sysctlconflist[i] in read_object.read():
            print(i+ " is existing")
            read_object.close()
        else:
            with open("sysctl.conf", "a") as write_object:
                write_object.write(_sysctlconflist[i])
                write_object.close()
Lasse ich die For-Schleife weg und setze den Index mit der Hand, wird in die Datei geschrieben, falls der String nicht vorhanden ist. Ansonsten passiert nichts. Nun wollte ich die Liste abarbeiten lassen, aber da scheitert es an meinen noch frischen Fähigkeiten. Leider bekomme ich das nicht gelöst und mich beschleicht das Gefühl, dass eine Lösung möglicherweise ganz anders aussehen muss.

Kann man mir da mal einen Anstoß in die richtige Richtung geben?
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Was soll der Unterstrich bei _sysctlconflist? Variablennamen sollten aussagekräftig sein, also dass es sich in der Liste um default-Werte handelt, dass es sich um eine Liste handelt sieht man ja am Typ.
`i` ist auch keine guter Name für einen Eintrag.
Es ist wenig sinnvoll, für jeden Eintrag der Liste, sysctl.conf jeweils komplett zu lesen.
Alles in Python ist ein Objekt, read_object ist daher auch kein guter Name.
`_sysctlconflist` ist eine Liste, ein Index muß also eine Zahl sein, und nicht der Eintrag der selben Liste. `i` ist ja bereits der gesuchte String.
Das with-Statement ist dazu da, dass die Datei wieder ordnungsgemäß geschlossen wird, `close` von Hand aufzurufen ist also unsinnig.
Der in-Operator ist falsch, weil so auch Zeilen "irgendwas.net.ip..." gefunden werden.
Willst Du wirklich, dass nur der Fall = 0 gefunden werden soll?

Code: Alles auswählen

SYSCTL_CONFIG = "sysctl.conf"

mandatory_lines = [
    "net.ipv4.ip_forward = 0\n",
    "net.ipv6.conf.all.forwarding = 0\n",
    "net.ipv4.conf.all.send_redirects = 0\n"
]

with open(SYSCTL_CONFIG) as input:
    config_lines = list(input)

lines_to_write = [
    line for line in mandatory_lines
    if line not in config_lines
]

if lines_to_write:
    with open(SYSCTL_CONFIG, "a") as output:
        output.writelines(lines_to_write)
Antworten