@Sophus Ich würde Dir gerne helfen, aber ich habe keine wirklich brauchbare Idee.
Ich habe noch nicht mit py2exe oder cx_freeze gearbeitet.
ich halte es für keine wirklich gute Idee, Fehler einfach zu ignorieren, ohne genau zu Wissen warum diese auftreten.
Ich weiss, Du hast hier gefragt und bisher keine befriedigende Antwort erhalten.
Meine Erfahrung mit Windows sagt mir jedoch, wenn Du cx_freeze jetzt einfach benutzt, nur weil es bei Dir jetzt gerade keinen Fehler erzeugt,
heißt das nicht unbedingt, welches das gleiche Programm bei mir auf meinem Windows-Rechner genauso fehlerfrei läuft.
ich arbeite auch mit Windows und Python und habe mit dieser Kombination schon die merkwürdigsten Dinge erlebt.
z.B. Fehlermeldungen, welche gar nicht erst angezeigt werden oder in einer separaten MessageBox, welche nur ganz kurz aufpoppt und dann noch hinter meiner eigenen Anwendung.
Ich persönlich fahre sehr gut damit, ein sauberes logging zu benutzen und auf print Anweisungen zu verzichten.
Code: Alles auswählen
import logging
import time
import os
workspace = os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))
logdir = os.path.join(workspace, 'log')
# The 5 different log levels are :
#
# logging.debug("debug message") # only File all.log
# logging.info("info message") # only File all.log and Console
# logging.warning("warning message") # only File all.log and Console
# logging.error("error message") # File all- and error.log and Console
# logging.critical("critical message") # File all- and error.log and Console
#
errorLogFile = os.path.join(logdir, '{}_test_error.log'.format(time.strftime('%Y%m%d')))
appLogFile = os.path.join(logdir, '{}_test_app.log'.format(time.strftime('%Y%m%d')))
# initialize the logger
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# create console handler
handler = logging.StreamHandler()
handler.setLevel(logging.INFO) # print console
formatter = logging.Formatter('\n=> %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
# create error file handler
handler = logging.FileHandler(errorLogFile, 'a')
handler.setLevel(logging.ERROR)
formatter = logging.Formatter('[%(asctime)s] %(name)-10s %(levelname)-8s %(module)-20s : %(lineno)-4d : %(message)s', datefmt='%d.%m.%Y-%H:%M:%S')
handler.setFormatter(formatter)
logger.addHandler(handler)
# create warning file handler
handler = logging.FileHandler(appLogFile, 'a')
handler.setLevel(logging.WARNING)
formatter = logging.Formatter('[%(asctime)s] %(name)-10s %(levelname)-8s %(module)-20s : %(lineno)-4d : %(message)s', datefmt='%d.%m.%Y-%H:%M:%S')
handler.setFormatter(formatter)
logger.addHandler(handler)
# create debug file handler
handler = logging.FileHandler(appLogFile, 'a')
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('[%(asctime)s] %(name)-10s %(levelname)-8s %(module)-20s : %(lineno)-4d : %(message)s', datefmt='%d.%m.%Y-%H:%M:%S')
handler.setFormatter(formatter)
logger.addHandler(handler)
Anstatt einer print Anweisung benutze ich zum Beispiel :
Auf meinem Bildschirm/Console erscheint :
=> Starte Funktion getURL
gleichzeitig wird in die Datei test_app.log
[28.06.2015-00:37:10] root INFO getDaten : 288 : Starte Funktion getURL
geschrieben.
Das hat mir schon sehr oft geholfen Fehler zu finden, welches mit einer einfachen print Anweisung nicht so ohne weiters möglich gewesen wäre.
Bitte übernimm jetzt nicht einfach obiges Beispiel, es berücksichtigt zum Beispiel kein multiprocessing oder threading.
Solltest Du Dich für ein sauberes Logging entscheiden, und hast hierzu weitergehende Fragen, wäre es vielleicht sinnvoll, einen separaten Thread zu erstellen, weil das ansonsten hier untergehen könnte.
Ich denke, es ist auch sinnvoll die erfahrenden Programmierer einmal über Deine Logging Konfiguration drüber schauen zu lassen, damit das wirklich alles ganz sauber funktioniert.
Ich denke nicht, dass dieses jetzt Dein aktuelles Problem behebt, aber zukünftige Fehler einfacher verifizieren lässt.
Darüber hinaus brauchst Du auch FILE_NAME nicht mehr hard coded im Modul speichern. => %(module)
VERSION_INFO = "0.0.1" würde ich ebenfalls hier nicht hard coded im Modul selber hinterlegen.
Ein zentrales Modul welches alle benötigten Informationen enthält ? Dann ginge so etwas wie check_update.version_info. Nur so eine Idee.
Die Anweisungen from xarphus.info import info_app, from xarphus.config import Configuration und set_get_settings = Configuration() werden in Deinem Modul gar nicht weiter benötigt.
Nach except ImportError as ImpErr einfach weiter zu arbeiten und nur eine Fehlermeldung auszugeben, macht für mich auch keinen wirklichen Sinn, weil eigentlich die Reise hier zu Ende ist.
Ich möchte Deinen Code hier jetzt nicht auseinander nehmen, aber einige Dinge erschliessen sich für mich nicht wirklich.
Ich würde jetzt wie folgt vorgehen :
Code: Alles auswählen
try:
logging.info('importiere requests ... [Start]')
import requests
logging.info('importiere requests ... [Done]')
....
def check_update():
try:
logging.info('requests.get ... [Start]')
data = requests.get("http://xarphus.de/xarphus_version.txt")
logging.info('requests.get ... [Done]')
logging.info('{} - {}'.format(data.text, VERSION_INFO)
# Das nachstehede gefällt mir nicht wirklich
# - VERSION_INFO ist bereits ein str
# - data.text ist ebenfalls bereits ein str
# - ob das if-statement wirklich immer funktioniert ???
# - Ich würde so etwas wie sys.version_info implementieren,
# dann geht so etwas wie sys.version_info >= (3, 0), da hätte
# ich ein grösseres vertrauen zu.
if str(data.text) > str(VERSION_INFO):
....
Wie gesagt das ist jetzt nur einmal so, was mir dazu eingefallen ist.