Für Python 3.3 und höher:
import shutil
command = 'ls'
shutil.which(command) is not None
Als Einzeiler von Jan-Philip Gehrcke Antwort:
cmd_exists = lambda x: shutil.which(x) is not None
Als Funktion:
def cmd_exists(cmd):
return shutil.which(cmd) is not None
Für Python 3.2 und früher:
my_command = 'ls'
any(
(
os.access(os.path.join(path, my_command), os.X_OK)
and os.path.isfile(os.path.join(path, my_command)
)
for path in os.environ["PATH"].split(os.pathsep)
)
Dies ist ein Einzeiler von Jay's Antwort, auch hier als Lambda-Funktion:
cmd_exists = lambda x: any((os.access(os.path.join(path, x), os.X_OK) and os.path.isfile(os.path.join(path, x))) for path in os.environ["PATH"].split(os.pathsep))
cmd_exists('ls')
Oder schließlich eingerückt als Funktion:
def cmd_exists(cmd, path=None):
""" test if path contains an executable file with name
"""
if path is None:
path = os.environ["PATH"].split(os.pathsep)
for prefix in path:
filename = os.path.join(prefix, cmd)
executable = os.access(filename, os.X_OK)
is_not_directory = os.path.isfile(filename)
if executable and is_not_directory:
return True
return False
4 Stimmen
Was ist falsch daran, nach der PATH-Umgebungsvariablen zu suchen? Was denkst du, was das UNIX-Befehl 'which' tut?
1 Stimmen
Ist das which.py Skript aus der Standardbibliothek ein einfacher Weg?
0 Stimmen
@J.F. - Das which.py-Skript, das mit Python enthalten ist, hängt von 'ls' ab, und einige der anderen Kommentare deuten darauf hin, dass Piotr nach einer plattformübergreifenden Antwort gesucht hat.
0 Stimmen
@Jay: Vielen Dank für den Kommentar. Ich habe coreutils auf Windows installiert, daher ist mir nicht aufgefallen, dass which.py unix-spezifisch ist.
0 Stimmen
Es gibt auch
which
, das Drittanbietermodul: code.activestate.com/pypm/which0 Stimmen
Zusammenhängend: stackoverflow.com/questions/646955/… Die Frage betrifft Windows, aber der Code funktioniert auch auf Posix-Geräten.
0 Stimmen
Beachten Sie, dass os.access() in Python 3.5 oder später nur Windows ACLs berücksichtigt (siehe bugs.python.org/issue2528).
3 Stimmen
Vielleicht sollte stackoverflow.com/a/13936916/145400 die akzeptierte Antwort im Jahr 2020 sein? :)