Pfad aus Fehlermeldung nutzen

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

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

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

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

Warum benutzt Du nicht onerror von rmtree?

Eine Funktion die `get_permission` heißt, sollte keine Rechte SETZEN.
TheBombTuber
User
Beiträge: 41
Registriert: Samstag 9. September 2017, 15:48

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?
Antworten