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?
Python Configparser funktioniert nicht bei Datei im Internet
-
- User
- Beiträge: 1
- Registriert: Montag 27. Mai 2019, 19:56
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:
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()
@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.
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.
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
›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.
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
Du willst eher soetwas benutzen:
https://stackoverflow.com/questions/510 ... m-the-user
- DeaD_EyE
- User
- Beiträge: 1236
- Registriert: Sonntag 19. September 2010, 13:45
- Wohnort: Hagen
- Kontaktdaten:
Natürlich geht das mit dem ConfigParser.
Ist komplett ohne Exceptionhandling, um es simpel zu halten.
Wenn es mehrere Configdateien sind, muss man halt iterieren.
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/
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
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))
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