Python Configparser funktioniert nicht bei Datei im Internet

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
jandie1505
User
Beiträge: 1
Registriert: Montag 27. Mai 2019, 19:56

Hallo,
ich habe in diesem Projekt ( http://github.com/jandie1505/easyUpdater , easyUpdater.py, Zeile 81-86) eine Config-Datei auf einem Server. Jedoch kann diese vom Configparser nicht gelesen werden.
Wenn ich jedoch eine lokale Datei nehme, funktioniert es wunderbar. Gibt es eine Möglichkeit wie ich auch Internetadressen verwenden kann, zum Beispiel wie in der config.yml angegeben?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Was heißt denn "Datei aus dem Internet"?
Zeig doch bitte an einem enfachen, kurzen Beispiel, was nicht funktioniert.
.read() liest eine lokale Datei. .read_string() kann einen String parsen - also den Inhalt einer Datei. Wenn du den Inhalt einer Datei von einer URL brauchst, dann musst du die Datei mit den Python-Bordmitteln abrufen und den Inhalt lesen. Stichwort urllib.

Was dein Programm angeht:

Keine einzige deiner Funktionen benutzt Parameter.
Funktionen sollten die benötigten Daten als Parameter bekommen (und nicht magisch irgendwo anders her) und ein Ergebnis per return zurück geben.
Werde alle globalen Variablen und damit auch das Wort global los. Ein global auf Modulebene ist auch noch sinnlos.

Auf Modulebene sollte nur die Definition von Konstanten, Funktionen und Klassen stehen.

Der start des Programms sollte in einer Funktion namens main() starten und aus dem folgendem Konstrukt am Ende der Datei aufgerufen werden:

Code: Alles auswählen

if __name__ == "__main__":
    main()
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@jandie1505: zu Deinem Code: `global` auf oberster Ebene hat exakt null Effekt. `global` sollte in einem ordentlichen Programm sowieso nicht vorkommen.
Dann sollten auf oberster Ebene nur Konstanten und (Funktions-)Definitionen stehen.
waittime ist eine Konstante und wird per Konvention KOMPLETT_GROSS geschrieben. Programme, die einen zwingen, ohne Grund zu warten, finde ich aber sowieso zum K****.
Alle weiteren Zuweisungen werden weiter unten aber wieder überschrieben, können also weg.
Alles was eine Funktion braucht, bekommt sie über ihre Parameter, ›updatefile‹ z.B. ›textfileaddress‹ warum dessen Wert aber an › configFilePath‹ gebunden wird, ist mir unklar. Handelt es sich hier nun um eine Adresse oder um einen Pfad?
›currentversion‹ kommt auch aus dem Nichts. Am Anfang weist Du dieser Variable eine Fließkommazahl zu, dann aber einen String, den Du mit < vergleichst. Das funktioniert bei üblichen Versionssstrings nicht. Wenn die Versionsnummer durch per . getrennte Zahlen besteht, splittet man den String üblicherweise beim Punkt, wandelt die Teile per int in Zahlen um und vergleicht das daraus erzeugte Tuple.
Ein ›return‹ am Ende einer Funktion ist überflüssig und kann weg.
Die while-Schleife mit `skip` ist eigentlich eine for-Schleife über Countdown, den man vereinfacht auch als Count-Up implementieren könnte. Wie kommst Du drauf, dass das zählen bis 250000 3 Sekunden dauert? Wenn Du 3 Sekunden warten willst, dann tu exakt dies. Jetzt wollte ich gerade schreiben, dass dieses keyboard-Modul da sicher schon was hat, hat es aber nicht, da die blöde wait-Methode kein timeout kennt.

Code: Alles auswählen

from threading import Event
def wait(hotkey, suppress=False, trigger_on_release=False, time_out=None):
    """
    Blocks the program execution until the given hotkey is pressed or,
    time is out.
    Returns True on keypress and False on timeout.
    """
    lock = Event()
    handler = add_hotkey(hotkey, lambda: lock.set(), suppress=suppress, trigger_on_release=trigger_on_release)
    result = lock.wait(timeout)
    remove_hotkey(handler)
    return result
sys.exit sollte in einem ordentlichen Programm nicht vorkommen, dazu gibt es die main-Funktion, die man einfach per `return` verlassen könnte.
›execfile‹ benutzt man üblicherweise nicht. Warum ist eUrecovery nicht einfach ein Modul, das eine recovery-Funktion hat, die Du einfach aufrufen könntest?
eUrecovery hat die selben Probleme wie easyupdater, und enthält den selben Code zum Lesen der Konfigurationsdatei. Das könnte man also zusammenfassen.

Dann behauptest Du in Deinen Beispieldateien, dass Du yaml benutzt, ist aber falsch, sind normale cfg-Dateien.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Achso, der Einsatz von keyboard ist falsch, denn niemand will ja, das Testendrücke irgendwo dazu führen, dass ein einem Programm die Installation gestartet wird.
Du willst eher soetwas benutzen:
https://stackoverflow.com/questions/510 ... m-the-user
Benutzeravatar
DeaD_EyE
User
Beiträge: 1236
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Natürlich geht das mit dem ConfigParser.

Code: Alles auswählen

from configparser import ConfigParser 
from urllib.request import urlopen


def get_config(url):
    req = urlopen(url)
    cfg = ConfigParser()
    cfg.read_string(req.read().decode())
    return cfg
Ist komplett ohne Exceptionhandling, um es simpel zu halten.

Wenn es mehrere Configdateien sind, muss man halt iterieren.

Code: Alles auswählen

def get_configs(urls):
    cfg = ConfigParser()
    for url in urls:
        conf_str = urlopen(url).read().decode()
        cfg.read_string(conf_str)
    return cfg

Code: Alles auswählen

config1 = get_config('https://pastebin.com/raw/vs9Jyyff')
config2 = get_configs(['https://pastebin.com/raw/vs9Jyyff', 'https://pastebin.com/raw/JT3LEQ8s'])

print(dict(config1))
print(dict(config2))
Das Beispiel verdeutlicht auch schön das Problem. Ich hab die Kontrolle über die Ressource (nicht ganz).
Wenn ein Programm Konfigurationen aus dem Internet lädt, bestimmt derjenige mit Zugriff auf die Ressource,
den Inhalt der Konfigurationsdatei. Für Hacker ist es ein beliebtes Ziel.

Selbst Microsoft macht solche gravierenden Fehler: https://www.zdnet.de/88358509/microsoft ... n-windows/
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten