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/
is_executable()
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.
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.
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
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?
Warum der unnütze code in zeile 13-14? Ein einfaches "os.access(fn, os.X_OK)" tuts auch?