staging.inyokaproject.org

Python .service Datei einlesen und verändern.

Status: Ungelöst | Ubuntu-Version: Ubuntu 17.10 (Artful Aardvark)
Antworten |

SuperSaurfang

Avatar von SuperSaurfang

Anmeldungsdatum:
7. November 2014

Beiträge: 24

Hallo,

Ich bin gerade dabei ein kleines Install Script mit Python für mein Node.js Server zu programmieren. Das Script soll auch, die .service Datei einlesen und die Pfade anpassen. Das einlesen Der Datei sieht aktuell so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def openservice(self, filename, path):
    """Main Class Node.js Installer"""
    fullpath = path
    shortpath = self.rmfile(path)
    if os.access(filename, os.R_OK):
        readfile = open(filename)
        for line in readfile:
            if "ExecStart" in line:
                exe = line
            if "WorkingDirectory" in line:
                working = line
        readfile.close()
        exe = self.rmpath(exe) + fullpath
        working = self.rmpath(working) + shortpath

gibt es eine möglichkeit mit python eine Datei zu öffnen ohne gleich den ganzen Inhalt zu löschen? oder sollte ich die ganze Datei einlesen auch wenn ich nur 2 Zeilen ändern möchte?

mfg

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@SuperSaurfang: Es gibt generell keine Möglichkeit nur bestimmte Zeilen in einer Textdatei zu ändern, weil man a) nicht gezielt Zeilen ansteuern kann und b) sich durch das ändern einer Zeile in der Regel auch die Länge ändert und damit auch alles was nach der Zeile kommt verschoben werden muss. Dateien sind eine Folge von Bytes. Um Textdateien zu ändern, muss man also eigentlich immer die gesamte Datei einlesen und die geänderte Datei neu schreiben. Alles andere wird sehr umständlich, fehleranfällig, oder funktioniert nur in Spezialfällen.

Wenn man es sicher machen möchte, dann schreibt man die Änderungen erst in eine neue Datei und benennt die dann am Ende zur ursprünglichen Datei um. So kann nichts verloren gehen wenn das Programm beim Verändern abbricht/abstürzt.

SuperSaurfang

(Themenstarter)
Avatar von SuperSaurfang

Anmeldungsdatum:
7. November 2014

Beiträge: 24

Hallo,

Okay dann werde ich wohl die ganze Datei einlesen.

mfg

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

ich hab's zwar noch nie selber getestet, aber .service-Dateien sollten sich mit dem configparser-Modul einlesen lassen, weil sie die passenden Struktur haben. Dann kannst du gezielt auf Sektionen und deren Schlüssel zugreifen.

Gruß, noisefloor

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

noisefloor schrieb:

Hallo,

ich hab's zwar noch nie selber getestet, aber .service-Dateien sollten sich mit dem configparser-Modul einlesen lassen, weil sie die passenden Struktur haben. Dann kannst du gezielt auf Sektionen und deren Schlüssel zugreifen.

Wobei bei Systemd-Service Dateien bestimmte Variablen mehrfach in einer Section vorkommen dürfen (z.B. darf es bei Type=oneshot mehrere ExecStart Einträge geben (vgl. Manpage zu systemd.service)- wenn sowas vorkommt, wirft das configparser-Modul einen Fehler.

SuperSaurfang schrieb:

Ich bin gerade dabei ein kleines Install Script mit Python für mein Node.js Server zu programmieren.

Ich würde mir überlegen, ob man das nicht gleich mit einem Tool wie Ansible umsetzt - da gibt es mit jinja2 auch eine nette Template-Engine.

Antworten |