is_executable()

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich kam auf die Idee durch einen ähnlich lautenden Thread, wollte diesen aber nicht für meine Version übernehmen. ;)

Es wird zunächst überprüft, ob es im aktuellen Verzeichnis eine passende ausführbare Datei gibt. Sollte dem nicht so sein, dann unter Nutzung der Umgebungsvariable `PATH`. Die Funktion ist getestet für Linux und Windows.

http://paste.pocoo.org/show/150762/
lunar

Ich sehe den Sinn einer solchen Funktion nicht, aber sei's drum. Jedenfalls steht das korrekte Trennzeichen in "os.pathsep", der bedingte Ausdruck in Zeile 25 und 26 ist daher unnötig.

Außerdem entspricht die Funktion nicht dem, was gemeinhin als "ausführbar" gilt, und zwar weder unter Unix-Derivaten noch unter Windows.

Unter Unix-Derivaten werden Namen, die kein Verzeichnistrennzeichen enthalten, immer in $PATH nachgeschlagen, und nie aus dem aktuellen Verzeichnis heraus ausgeführt. Unter Windows fehlt die komplette $PATHEXT-Logik. Ein Kommando namens "foo" kann unter Windows "foo.exe", "foo.cmd", usw. heißen.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich hab's mal komplett umgebaut. Die Intention war auch eher so etwas wie ein portables `which` für Python, das zusätzlich im aktuellen Verzeichnis suchen kann.

Code: Alles auswählen

import os

def get_executables(filename, use_path_var=True):
    paths = (os.getenv('PATH') or os.defpath).split(os.pathsep)
    executables = []

    if os.access(filename, os.X_OK):
        executables.append(filename)

    if not use_path_var:
        return executables

    if not os.sep in filename:
        for entry in paths:
            path = os.path.join(entry, filename)
            if os.access(path, os.X_OK):
                executables.append(path)
    return executables
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

Abgesehen davon dass ich keinen unterschied von deiner funktion zu "which" erkennen kann, ist schon der funktions-name irreführend.

Warum der unnütze code in zeile 13-14? Ein einfaches "os.access(fn, os.X_OK)" tuts auch?
Antworten