Seite 1 von 2

Re: Pfad aus Fehlermeldung nutzen

Verfasst: Montag 21. Januar 2019, 14:41
von TheBombTuber
Momentan löse ich das Problem über Zeichenketten
(Sollte vorerst auch kein Problem sein da alle Systeme gleiche Grundeinstellungen haben)

Code: Alles auswählen

# -*- coding: utf-8 -*-
import os
import shutil
import time
import stat

benutzer = os.getlogin()
path_new = r"\\srv-23v-isea-01\temp\CPO\aft_GRCLITE"
suchpfad = r"C\w"
def remove_files(path):
    for filename in os.listdir(path):
        while True:
            try:
                print(filename + " wird entfernt")
                shutil.rmtree(os.path.join(path, filename))
            except FileNotFoundError:
                print("Zu Löschende Datei konnte nicht gefunden werden")
                break
            except PermissionError as err:
                help(err)
                x = str(err)
                umgehen = x[34:-1]
                os.chmod(umgehen, stat.S_IWRITE)
                break
            break
        break

            
def add_files(path_new):
    for filename_new in os.listdir(path_new):
        time.sleep(2)
        print(os.path.join(filename_new + " wird eingefügt"))
        shutil.copytree(os.path.join(path_new, filename_new), os.path.join(path, filename_new))

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.")
            time.sleep(2)
            remove_files(path)
            print("Alle Datein erfolgreich entfernt")
            time.sleep(2)
            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')
Ich werde versuchen es vernünftig mit Attributen zu lösen muss mich da aber denke ich erst einmal intensiver einlesen.

Re: Pfad aus Fehlermeldung nutzen

Verfasst: Montag 21. Januar 2019, 14:48
von __blackjack__
@TheBombTuber: Die Ausnahme ist doch bereits ein Exemplar einer Klasse, die Du sogar kennst, denn die hast Du ja selbst beim ``except`` angegeben: `PermissionError`. Neben dem Hinweis von sparrow wie man Infos live von dem Objekt bekommen kann, kannst Du natürlich auch in der Python-Dokumention nachlesen was es mit diesem Datentyp auf sich hat.

Re: Pfad aus Fehlermeldung nutzen

Verfasst: Montag 21. Januar 2019, 20:02
von Sirius3
@TheBombTuber: Du scheinst einen zwingen zu wollen, die Musterlösung zu liefern, weil es einem beim Lesen weh tut. Da sind auch einige `breaks` zu viel, womit die while-Schleife auch überflüssig ist:

Code: Alles auswählen

def remove_files(path):
    for filename in os.listdir(path):
        try:
            print("{} wird entfernt".format(filename))
            shutil.rmtree(os.path.join(path, filename))
        except FileNotFoundError:
            print("Zu Löschende Datei konnte nicht gefunden werden")
        except PermissionError as err:
            os.chmod(err.filename, stat.S_IWRITE)

Re: Pfad aus Fehlermeldung nutzen

Verfasst: Montag 21. Januar 2019, 20:16
von __blackjack__
@Sirius3: Wobei das in der Funktion IMHO nix zu suchen hat. Jetzt haben wir eine Funktion um in einem Ordner alle Unterordner zu löschen (und der sollte nur Ordner enthalten, sonst kracht's) und der alle löscht, ausser das rekursive löschen trifft auf einen `PermissionError`. Da werden nur die Rechte geändert und die komplette weitere Löschaktion des Ordners in dem das passiert ist abgebrochen. Ohne das der Aufrufer da etwas von mitbekommt. Wahrscheinlich war die durch die ``break``\s sinnfrei gemachte ``while``-Schleife ein Versuch das so lange zu wiederholen bis wirklich alles in dem Verzeichnis gelöscht ist.

Ich denke ja immer noch etwas mit dem `onerror`-Argument von `rmtree()` ist die sinnvollere Lösung.

Re: Pfad aus Fehlermeldung nutzen

Verfasst: Dienstag 22. Januar 2019, 06:47
von sparrow
@TheBombTuber: Deine Lösung steckt in einer Endlosschleife, sollte sich das Rechteproblem mit dem chmod nicht beseitigen lassen.

Ansonsten tendiere ich wie BJ rmtree() mit onerror.

Re: Pfad aus Fehlermeldung nutzen

Verfasst: Dienstag 22. Januar 2019, 08:58
von TheBombTuber
sparrow hat geschrieben: Dienstag 22. Januar 2019, 06:47 @TheBombTuber: Deine Lösung steckt in einer Endlosschleife, sollte sich das Rechteproblem mit dem chmod nicht beseitigen lassen.

Ansonsten tendiere ich wie BJ rmtree() mit onerror.
Mir ist auch heute mein eigentlich größter Fehler aufgefallen. Warum sollte ich den darauf warten, dass der Permission Error auftritt vor allem da theoretisch irgendwann auch mal ein Rechte Problem auftauchen kann also Admin benötigt und alles dann sowieso niemals enden würde.

Und nachdem ich davon abgekommen bin, dass ich unbedingt die Fehlermeldung bekämpfen muss umgehe ich sie jetzt einfach.

Code: Alles auswählen

def get_permission(path):
    for root, dirs, files in os.walk(path, topdown=True):
                    for name in files:
                        os.chmod(os.path.join(root, name), stat.S_IWRITE)

Code: Alles auswählen

import os
import shutil
import time
import stat

benutzer = os.getlogin()
path_new = r"\\srv-23v-isea-01\temp\CPO\aft_GRCLITE"

def remove_files(path):
    for filename in os.listdir(path):
        try:
            print(filename + " wird entfernt")
            shutil.rmtree(os.path.join(path, filename))
        except FileNotFoundError:
            print("Zu Löschende Datei konnte nicht gefunden werden")

            
def add_files(path_new):
    for filename_new in os.listdir(path_new):
        time.sleep(2)
        print(os.path.join(filename_new + " wird eingefügt"))
        shutil.copytree(os.path.join(path_new, filename_new), os.path.join(path, filename_new))

def get_permission(path):
    for root, dirs, files in os.walk(path, topdown=True):
                    for name in files:
                        os.chmod(os.path.join(root, name), stat.S_IWRITE)
                        
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.")
            get_permission(path)
            time.sleep(2)
            remove_files(path)
            print("Alle Datein erfolgreich entfernt")
            time.sleep(2)
            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')
Den warum etwas unsicher bekämpfen, wenn man es verhindern kann

Re: Pfad aus Fehlermeldung nutzen

Verfasst: Dienstag 22. Januar 2019, 09:36
von Sirius3
Warum benutzt Du nicht onerror von rmtree?

Eine Funktion die `get_permission` heißt, sollte keine Rechte SETZEN.

Re: Pfad aus Fehlermeldung nutzen

Verfasst: Dienstag 22. Januar 2019, 11:41
von TheBombTuber
Sirius3 hat geschrieben: Dienstag 22. Januar 2019, 09:36 Warum benutzt Du nicht onerror von rmtree?

Eine Funktion die `get_permission` heißt, sollte keine Rechte SETZEN.
Danke für den hinweis mit 'get_permission' habe meinen Schreibfehler korrigiert und es auf 'set_permission' geändert.

Wenn ich mit onerror Arbeite habe ich doch das Problem, dass wenn Administratorrechte benötigt werden der Fehler nicht eindeutig ist.

Oder liege ich falsch?