Ausführen einer py exe

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
TheBombTuber
User
Beiträge: 46
Registriert: Samstag 9. September 2017, 15:48

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?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@TheBombTuber: ohne Fehlermeldung kann man schlecht helfen. Hast Du alle Abhängigkeiten mit eingebunden? Um was handelt es sich?
TheBombTuber
User
Beiträge: 46
Registriert: Samstag 9. September 2017, 15:48

Sirius3 hat geschrieben: Montag 14. Januar 2019, 11:47 @TheBombTuber: ohne Fehlermeldung kann man schlecht helfen. Hast Du alle Abhängigkeiten mit eingebunden? Um was handelt es sich?

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
der Pyinstaller macht die Umwandlung automatisch und bindet alles mit ein.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast da ja diverse hard-codierte Pfade drin. Das waere mein erster Verdacht.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
TheBombTuber
User
Beiträge: 46
Registriert: Samstag 9. September 2017, 15:48

__deets__ hat geschrieben: Montag 14. Januar 2019, 12:22 Du hast da ja diverse hard-codierte Pfade drin. Das waere mein erster Verdacht.
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?
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Übergib die Pfade als Parameter beim aufruf: https://docs.python.org/3/library/sys.html#sys.argv
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
TheBombTuber
User
Beiträge: 46
Registriert: Samstag 9. September 2017, 15:48

__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.
Ich habe nun einmal die "while True" schleife entfernt und jetzt funktioniert es auch in der .exe.

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")
Aber wie könnte ich denn am besten das "for path in" ersetzen?
Benutzeravatar
__blackjack__
User
Beiträge: 13077
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
TheBombTuber
User
Beiträge: 46
Registriert: Samstag 9. September 2017, 15:48

__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?
@__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.

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.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Antworten