Seite 1 von 1

Programm in Ordner suchen

Verfasst: Mittwoch 16. September 2020, 22:22
von JakobPrie
Hallo,
ich möchte ein Skript schreiben, welches ein Programm auf dem Rechner anhand eines eingegebenen Strings sucht und bei einem Treffer dieses ausführt. dafür gebe ich als String den Namen an und gegebenenfalls die Datei-Endung. In den program_paths werden alle Pfade angegeben, in welchen Programme installiert werden.
Dafür habe ich mal folgendes geschrieben:

Code: Alles auswählen

    def __init__(self):
        self.program_paths = program_paths
        self.open_program_done = False

Code: Alles auswählen

    def open(self, program_name, ending='exe'):
        for item in program_paths:
            finder = Thread(target=self.find_files(self, program_name, item, ending))
            finder.daemon = True
            finder.start()

Code: Alles auswählen

    def find_files(self, program_name, root, ending):
        for root, dirs, files in os.walk(root):
            for f in files:
                if f.lower().endswith(ending) and program_name.lower() in f.lower():
                    f = os.path.join(root, f)
                    print(f)
                    temp_name = program_name + "." + ending
                    if temp_name == f:
                        subprocess.Popen(f)
                if open_program_done:
                    break
            if not open_program_done:
                for d in dirs:
                    d = os.path.join(root, d)
                    self.find_files(self, d, ending, ending)
            else:
                break
Damit das ganze nicht zu lange dauert habe ich mit Threads gearbeitet. Allerdings ist meine Plazierung, bzw Umsetzung von open_program_done absolut falsch. Meine Idee war es, dass der finder aufhört, wenn bereits eine Datei mit dem richtigen Namen gefunden wurde.
Vielen Dank für Eure Hilfe!

Re: Programm in Ordner suchen

Verfasst: Mittwoch 16. September 2020, 23:03
von Sirius3
Statt os.walk und os.path.join sollte man pathlib.Path.rglob benutzen.
temp_name kann nie gleich f sein. open_program_done ist nicht definiert.
Die for-d-in-dirs-Schleife ist unsinnig, da das schon os.walk, bzw. pathlib.Path.rglob erledigt.
Einem Thread wird per target eine Funktion übergeben, nicht der Rückgabewert des Aufrufs einer Funktion. `find_files` wird ein Argument zu viel übergeben. `program_paths` wird nirgends definiert.

Bevor Du anfängst, eine ganze Klasse mit mehreren Methoden zu schreiben, solltest Du die einzelnen Teile erst ausgiebig testen.

Re: Programm in Ordner suchen

Verfasst: Donnerstag 17. September 2020, 07:19
von Sirius3
Nochmal ich: eine Funktion die find_files heißt, sollte nicht ein Programm ausführen, sondern tatsächlich nur die gefundenen Stellen zurückgeben.
Das ganze ohne die Klasse (die im Moment noch unnötig ist):

Code: Alles auswählen

from pathlib import Path

def find_files(program_paths, program_name, ending=".exe"):
    found_program_paths = []
    program_name += ending
    for path in program_paths:
        found_program_paths.extend(Path(path).rglob(program_name))
    return found_program_paths 

Re: Programm in Ordner suchen

Verfasst: Donnerstag 17. September 2020, 11:56
von JakobPrie
Sirius3 hat geschrieben: Donnerstag 17. September 2020, 07:19 Nochmal ich: eine Funktion die find_files heißt, sollte nicht ein Programm ausführen, sondern tatsächlich nur die gefundenen Stellen zurückgeben.
Das ganze ohne die Klasse (die im Moment noch unnötig ist):

Code: Alles auswählen

from pathlib import Path

def find_files(program_paths, program_name, ending=".exe"):
    found_program_paths = []
    program_name += ending
    for path in program_paths:
        found_program_paths.extend(Path(path).rglob(program_name))
    return found_program_paths 
Vielen Dank für Deine Hilfe!

Re: Programm in Ordner suchen

Verfasst: Donnerstag 17. September 2020, 12:12
von JakobPrie
Sirius3 hat geschrieben: Donnerstag 17. September 2020, 07:19 Nochmal ich: eine Funktion die find_files heißt, sollte nicht ein Programm ausführen, sondern tatsächlich nur die gefundenen Stellen zurückgeben.
Das ganze ohne die Klasse (die im Moment noch unnötig ist):

Code: Alles auswählen

from pathlib import Path

def find_files(program_paths, program_name, ending=".exe"):
    found_program_paths = []
    program_name += ending
    for path in program_paths:
        found_program_paths.extend(Path(path).rglob(program_name))
    return found_program_paths 
Lassen sich mit diesem Algorithmus auch Verknüpfungen finden? Bei mir hat das gerade nicht ganz geklappt

Kann ich den Algorithmus alternativ auch irgendwie umbauen, dass auch Treffer gedunden werden, in welchen der Programm-name nur vorkommt? Weil das exe von Word heißt WINWORD.EXE, ich suche aber nach dem Programm_namen "word"

Re: Programm in Ordner suchen

Verfasst: Donnerstag 17. September 2020, 12:19
von Jankie
Verknüpfungen funktionieren bei mir, da musst du das ending halt nur auf ".lnk" setzen. Und bitte nicht immer die Beiträge zitieren.

Code: Alles auswählen

print(find_files([r"C:\Users\xxx\Desktop"], "TEST", ending=".lnk"))
Und so zeigt er mit alle .bmp an die "Neue" im Namen haben (Bin mir aber nicht sicher, ob es bessere Möglichkeiten gibt):

Code: Alles auswählen

from pathlib import Path

def find_files(program_paths, program_name, ending=".exe"):
    found_program_paths = []
    for path in program_paths:
        for pattern in [f"*{program_name}*", f"{program_name}*", f"*{program_name}"]:
            found_program_paths.extend(Path(path).rglob(pattern))
    return found_program_paths 


print(find_files([r"C:\Users\xxx\Desktop"], "Neue", ending=".bmp"))

Re: Programm in Ordner suchen

Verfasst: Donnerstag 17. September 2020, 12:58
von Jankie
Gerade gemerkt das dort das ending nicht beachtet wird, hier noch mal, aber nun mit Berücksichtigung des endings.

Code: Alles auswählen

from pathlib import Path

def find_files(program_paths, program_name, ending=".exe"):
    found_program_paths = []
    for path in program_paths:
        for pattern in [f"*{program_name}*{ending}", f"{program_name}*{ending}", f"*{program_name}{ending}"]:
            found_program_paths.extend(Path(path).rglob(pattern))
    return found_program_paths 


print(find_files([r"C:\Program Files"], "pad", ending=".exe"))

Re: Programm in Ordner suchen

Verfasst: Donnerstag 17. September 2020, 13:25
von Sirius3
@Jankie: * bedeutet "beliebig viele Zeichen" und beliebig viele sind auch 0, so dass alle weiteren Pattern schon mit dem ersten abgedeckt sind.
Bei der Verallgemeinerung sind die Variablennamen verwirrend.

Code: Alles auswählen

def find_files(paths, filename_part, ending=""):
    found_paths = []
    for path in paths:
        found_paths .extend(Path(path).rglob(f"*{filename_part}*{ending}"))
    return found_paths 

Re: Programm in Ordner suchen

Verfasst: Donnerstag 17. September 2020, 13:50
von __blackjack__
Kleine Warnung: Wenn man mit "word" auch "winword.exe" finden will, kann es natürlich passieren, dass man auch "wordpad.exe" findet. Wie wird dann entschieden welches davon gestartet wird‽

Re: Programm in Ordner suchen

Verfasst: Donnerstag 17. September 2020, 21:17
von JakobPrie
__blackjack__ hat geschrieben: Donnerstag 17. September 2020, 13:50 Kleine Warnung: Wenn man mit "word" auch "winword.exe" finden will, kann es natürlich passieren, dass man auch "wordpad.exe" findet. Wie wird dann entschieden welches davon gestartet wird‽
Ich habe eine alternative lösung gefunden:
Und zwar such eich einfach in dem Ordner C:\ProgramData\Microsoft\Windows\Start Menu\Programs, in welchem Verknüpfungen zu allen programmen, die ich benötige sind. Da muss ich mir auch keine Gedanken um den Namen der datei machen, da hier nutzerfreundliche genommen werden.
Aber danke an alle für die Hilfe

Re: Programm in Ordner suchen

Verfasst: Montag 21. September 2020, 18:09
von JakobPrie
Sirius3 hat geschrieben: Donnerstag 17. September 2020, 07:19 Nochmal ich: eine Funktion die find_files heißt, sollte nicht ein Programm ausführen, sondern tatsächlich nur die gefundenen Stellen zurückgeben.
Das ganze ohne die Klasse (die im Moment noch unnötig ist):

Code: Alles auswählen

from pathlib import Path

def find_files(program_paths, program_name, ending=".exe"):
    found_program_paths = []
    program_name += ending
    for path in program_paths:
        found_program_paths.extend(Path(path).rglob(program_name))
    return found_program_paths 
Wie kann ich diesen Algorithmus umbauen, dass er sobald er einen Pfad gefunden hat, abbricht?

Re: Programm in Ordner suchen

Verfasst: Montag 21. September 2020, 18:09
von JakobPrie
Sirius3 hat geschrieben: Donnerstag 17. September 2020, 07:19 Nochmal ich: eine Funktion die find_files heißt, sollte nicht ein Programm ausführen, sondern tatsächlich nur die gefundenen Stellen zurückgeben.
Das ganze ohne die Klasse (die im Moment noch unnötig ist):

Code: Alles auswählen

from pathlib import Path

def find_files(program_paths, program_name, ending=".exe"):
    found_program_paths = []
    program_name += ending
    for path in program_paths:
        found_program_paths.extend(Path(path).rglob(program_name))
    return found_program_paths 
Wie kann ich diesen Algorithmus umbauen, dass er sobald er einen Pfad gefunden hat, abbricht?

Re: Programm in Ordner suchen

Verfasst: Montag 21. September 2020, 18:24
von Sirius3
@JakobPrie: was denkst Du, wie man das umschreiben kann?