Hallo Ich habe ein Programm von mir mit dem pyinstaller in eine .exe umgewandelt.
Bisher konnte ich damit auch alle Python Programme auf anderen Rechnern ausführen.
Eines meiner Programme allerdings starte nicht richtig.
Wenn ich es auf meinem Rechner anstarte ist alles i.O. starte ich es allerdings auf einem anderen Rechner öffnet sich kurz die Konsole und schließt sich sofort wieder.
Ich habe bereits versucht die .exe über die Konsole zu starten um mögliche Fehlermeldungen abzufangen. Allerdings wird keine Fehlermeldung angezeigt.
Das Ausführen als Administrator hat auch nicht geholfen
Hatte jemand schon mal ein ähnliches Problem?
Ausführen einer py exe
-
- User
- Beiträge: 49
- Registriert: Samstag 9. September 2017, 15:48
Code: Alles auswählen
# -*- coding: utf-8 -*-
"""
Created on Tue Dec 4 08:45:14 2018
@author: cpohlmann
"""
import os
import shutil
import time
benutzer = os.getlogin()
path_new = r"\\srv-23v-isea-01\temp\CPO\aft_GRCLITE"
def remove_files(path):
for filename in os.listdir(path):
print(filename + " wird entfernt")
time.sleep(0.5)
shutil.rmtree(os.path.join(path, filename))
def add_files(path_new):
for filename_new in os.listdir(path_new):
print(os.path.join(filename_new + " wird eingefügt"))
shutil.copytree(os.path.join(path_new, filename_new), os.path.join(path, filename_new))
while True:
try:
for path in [
r"C:\cad\vwg\catia\vwgrclite\opt\aft",
r"C:\catiav5\vwg\catia\vwgrclite\opt\aft",
]:
if os.path.isdir(path):
print("Hallo " + benutzer)
print('Bitte beachte, dass beim Forfahren Catia beendet wird!!\nBitte alle Daten speichern und anschließend "Enter" drücken')
close = input()
if close == '':
os.system("taskkill /f /im CNEXT.exe")
print("Die alten Additionals werden entfernt.")
remove_files(path)
os.system("cls")
add_files(path_new)
os.system("cls")
print("Der Austausch ist abgeschlossen.\nZum beenden Enter drücken.")
input()
break
else:
print('Programm wird beendet')
time.sleep(2)
break
break
break
break
except PermissionError:
shutil.copymode(path_new, path)
continue
except FileNotFoundError:
print("Zu Löschende Datei konnte nicht gefunden werden")
time.sleep(5)
break
Nachtrag: du kannst versuchen, das Programm in der CMD.EXE auszufuehren, um ggf. eine Fehlermeldung zu sehen. Ausserdem begehst du eine der ueblichen Suenden, Code auf Modulebene auszufuehren. Wenn du dein Programm so umschreibst, dass es eine vernuenftige main-Funktion hat, die dann ausgefuehrt wird - dann ist es auch ein leichtes, darum eine allgemeine Fehlerbehandlung zu setzen, die dir einen Fehler ausgibt, zur not zB auch in eine Datei geschrieben etc.
- __blackjack__
- User
- Beiträge: 13111
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@TheBombTuber: Kann es sein das es den Pfad C:\cad\vwg\catia\vwgrclite\opt\aft nicht gibt? Denn dann wäre dass das ganz normale, erwartbare Verhalten von diesem Programm.
Die ``while True:``- und die ``for path in …``-Schleifen sind übrigens irreführend weil die jeweils nur einmal ausgeführt werden. Vielleicht möchtest Du das a) ohne diese sinnfreien Schleifen schreiben, oder b) noch mal über die exzessive Verwendung von ``break`` nachdenken.
Das ``continue`` ist auch überflüssig.
Die Behandlung vom `FileNotFoundError` würde ich um die ``while``-Schleife legen, dann kann man sich ein ``break`` sparen was den Programmfluss leichter verständlich macht.
Falls `sleep()` zum offenhalten der Konsole verwendet wird: Keine gute Idee. Die Konsole wird dann bei unerwarteten Ausnahmen immer zugehen, Du wirst also bei Fehlern auf diese Weise nie Infos über den Traceback bekommen. Was für die Fehlersuche nicht gerade förderlich ist.
Die ``while True:``- und die ``for path in …``-Schleifen sind übrigens irreführend weil die jeweils nur einmal ausgeführt werden. Vielleicht möchtest Du das a) ohne diese sinnfreien Schleifen schreiben, oder b) noch mal über die exzessive Verwendung von ``break`` nachdenken.
Das ``continue`` ist auch überflüssig.
Die Behandlung vom `FileNotFoundError` würde ich um die ``while``-Schleife legen, dann kann man sich ein ``break`` sparen was den Programmfluss leichter verständlich macht.
Falls `sleep()` zum offenhalten der Konsole verwendet wird: Keine gute Idee. Die Konsole wird dann bei unerwarteten Ausnahmen immer zugehen, Du wirst also bei Fehlern auf diese Weise nie Infos über den Traceback bekommen. Was für die Fehlersuche nicht gerade förderlich ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
-
- User
- Beiträge: 49
- Registriert: Samstag 9. September 2017, 15:48
Die Pfade passen so.
Das Programm soll nur laufen wenn eine der beiden Pfade unter "path" vorhanden sind und dann alle Dateien aus "path_new" kopieren.
Oder gibt es eine Möglichkeit die Pfade anders einzubringen?
Übergib die Pfade als Parameter beim aufruf: https://docs.python.org/3/library/sys.html#sys.argv
Natuerlich, zB per Drag and Drop oder einer GUI oder eine Konfigurationsdatei oder per Webservice oder oder oder...
Tatsache ist, dass dein Skript annahmen macht ueber die Umgebung, und wenn alles so waere wie du es glaubst das es ist, dann wuerde es ja klappen, oder? Tut es aber nicht. Also wuerde ich dir vorschlagen, die Fehlerbehandlung zu verbessern. Und dein Skript im Zweifel auf dem Rechner, auf dem es jetzt nicht laeuft, mal mit einem explizit installierten Python-Interpreter laufen zu lassen.
Tatsache ist, dass dein Skript annahmen macht ueber die Umgebung, und wenn alles so waere wie du es glaubst das es ist, dann wuerde es ja klappen, oder? Tut es aber nicht. Also wuerde ich dir vorschlagen, die Fehlerbehandlung zu verbessern. Und dein Skript im Zweifel auf dem Rechner, auf dem es jetzt nicht laeuft, mal mit einem explizit installierten Python-Interpreter laufen zu lassen.
-
- User
- Beiträge: 49
- Registriert: Samstag 9. September 2017, 15:48
Ich habe nun einmal die "while True" schleife entfernt und jetzt funktioniert es auch in der .exe.__blackjack__ hat geschrieben: ↑Montag 14. Januar 2019, 12:23 @TheBombTuber: Kann es sein das es den Pfad C:\cad\vwg\catia\vwgrclite\opt\aft nicht gibt? Denn dann wäre dass das ganz normale, erwartbare Verhalten von diesem Programm.
Die ``while True:``- und die ``for path in …``-Schleifen sind übrigens irreführend weil die jeweils nur einmal ausgeführt werden. Vielleicht möchtest Du das a) ohne diese sinnfreien Schleifen schreiben, oder b) noch mal über die exzessive Verwendung von ``break`` nachdenken.
Das ``continue`` ist auch überflüssig.
Die Behandlung vom `FileNotFoundError` würde ich um die ``while``-Schleife legen, dann kann man sich ein ``break`` sparen was den Programmfluss leichter verständlich macht.
Falls `sleep()` zum offenhalten der Konsole verwendet wird: Keine gute Idee. Die Konsole wird dann bei unerwarteten Ausnahmen immer zugehen, Du wirst also bei Fehlern auf diese Weise nie Infos über den Traceback bekommen. Was für die Fehlersuche nicht gerade förderlich ist.
Code: Alles auswählen
# -*- coding: utf-8 -*-
"""
Created on Tue Dec 4 08:45:14 2018
@author: cpohlmann
"""
import os
import shutil
import time
benutzer = os.getlogin()
path_new = r"\\srv-23v-isea-01\temp\CPO\aft_GRCLITE"
def remove_files(path):
for filename in os.listdir(path):
print(filename + " wird entfernt")
time.sleep(0.5)
shutil.rmtree(os.path.join(path, filename))
def add_files(path_new):
for filename_new in os.listdir(path_new):
print(os.path.join(filename_new + " wird eingefügt"))
shutil.copytree(os.path.join(path_new, filename_new), os.path.join(path, filename_new))
try:
for path in [
r"C:\cad\vwg\catia\vwgrclite\opt\aft",
r"C:\catiav5\vwg\catia\vwgrclite\opt\aft",
]:
if os.path.isdir(path):
print("Hallo " + benutzer)
print('Bitte beachte, dass beim Forfahren Catia beendet wird!!\nBitte alle Daten speichern und anschließend "Enter" drücken')
close = input()
if close == '':
os.system("taskkill /f /im CNEXT.exe")
print("Die alten Additionals werden entfernt.")
remove_files(path)
os.system("cls")
add_files(path_new)
os.system("cls")
print("Der Austausch ist abgeschlossen.\nZum beenden Enter drücken.")
input()
else:
print('Programm wird beendet')
except PermissionError:
shutil.copymode(path_new, path)
except FileNotFoundError:
print("Zu Löschende Datei konnte nicht gefunden werden")
- __blackjack__
- User
- Beiträge: 13111
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@TheBombTuber: Wieso willst Du das ersetzen? Ich weiss ja auch nicht ob Du die ``while``-Schleife nicht eigentlich haben wolltest. Und nun sind *alle* ``break`` aus dem Programm verschwunden. Ist das richtig so? Was hast Du dir bei jedem einzelnen ``break`` sowohl beim Schreiben des Originalcodes als auch beim entfernen gedacht?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
-
- User
- Beiträge: 49
- Registriert: Samstag 9. September 2017, 15:48
@__blackjack__: Die "while" Schleife war grundsätzlich nur dafür da um den Permission Error abzufangen (und zu beheben) und anschließend das Programm weiterlaufen zu lassen ohne einen neustart.__blackjack__ hat geschrieben: ↑Montag 14. Januar 2019, 13:14 @TheBombTuber: Wieso willst Du das ersetzen? Ich weiss ja auch nicht ob Du die ``while``-Schleife nicht eigentlich haben wolltest. Und nun sind *alle* ``break`` aus dem Programm verschwunden. Ist das richtig so? Was hast Du dir bei jedem einzelnen ``break`` sowohl beim Schreiben des Originalcodes als auch beim entfernen gedacht?
Ohne die "while" Schleife läuft nun der "shutil.copymode" im eigentlichen code mit ab, da dadurch sowieso keine merklich längere Laufzeit entsteht.
Die "break" hatte ich nur drin um eben in einzelnen fällen aus der schleif herauszukommen.
@TheBombTuber: das waren aber nicht einzelne Fälle, sondern das `break` wurde immer am Ende jeder Schleife durchgeführt, was die Schleifen nutzlos gemacht hat.
Weiterhin zum Code: nicht Tabs und Leerzeichen mischen! Eingerückt wird immer mit 4 Leerzeichen pro Eben.
Weder die Meldung "Zum beenden Enter drücken." noch 'Programm wird beendet' sind richtig.
Überleg nochmal, wann PermissionError oder FileNotFoundError auftreten können, und an welcher Stelle sie also korrekterweise behandelt werden sollten.
Weiterhin zum Code: nicht Tabs und Leerzeichen mischen! Eingerückt wird immer mit 4 Leerzeichen pro Eben.
Weder die Meldung "Zum beenden Enter drücken." noch 'Programm wird beendet' sind richtig.
Überleg nochmal, wann PermissionError oder FileNotFoundError auftreten können, und an welcher Stelle sie also korrekterweise behandelt werden sollten.