377 Stimmen

Überprüfen Sie, ob eine ausführbare Datei in Python vorhanden ist?

In Python gibt es eine portable und einfache Möglichkeit zu testen, ob ein ausführbares Programm existiert?

Mit einfach meine ich etwas wie den which-Befehl, der einfach perfekt wäre. Ich möchte nicht manuell im PATH suchen oder etwas probieren, das versucht, es mit Popen & Co. auszuführen und zu sehen, ob es fehlschlägt (das ist das, was ich gerade mache, aber stelle dir vor, es ist launchmissiles)

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.

2voto

wukong Punkte 2240

Unterstützung für Windows hinzugefügt

def which(program):
    path_ext = [""];
    ext_list = None

    if sys.platform == "win32":
        ext_list = [ext.lower() for ext in os.environ["PATHEXT"].split(";")]

    def is_exe(fpath):
        exe = os.path.isfile(fpath) and os.access(fpath, os.X_OK)
        # nach ausführbarer Datei unter Windows suchen
        if not exe:
            if ext_list:
                for ext in ext_list:
                    exe_path = "%s%s" % (fpath,ext)
                    if os.path.isfile(exe_path) and os.access(exe_path, os.X_OK):
                        path_ext[0] = ext
                        return True
                return False
        return exe

    fpath, fname = os.path.split(program)

    if fpath:
        if is_exe(program):
            return "%s%s" % (program, path_ext[0])
    else:
        for path in os.environ["PATH"].split(os.pathsep):
            path = path.strip('"')
            exe_file = os.path.join(path, program)
            if is_exe(exe_file):
                return "%s%s" % (exe_file, path_ext[0])
    return None

1voto

ash Punkte 633

Ein wichtige Frage ist "Warum musst du testen, ob die ausführbare Datei existiert?" Vielleicht musst du das nicht? ;-)

Kürzlich benötigte ich diese Funktionalität, um den Viewer für eine PNG-Datei zu starten. Ich wollte über einige vordefinierte Viewer iterieren und den ersten ausführen, der existiert. Glücklicherweise stieß ich auf os.startfile. Es ist viel besser! Einfach, tragbar und verwendet den Standard Viewer auf dem System:

>>> os.startfile('deinedatei.png')

Update: Ich lag falsch, dass os.startfile tragbar ist... Es funktioniert nur auf Windows. Auf einem Mac musst du den open Befehl ausführen. Und xdg_open auf Unix. Es gibt ein Python issue zur Hinzufügung von Mac- und Unix-Unterstützung für os.startfile.

1voto

jung rhew Punkte 660

Sie können die externe Bibliothek namens "sh" ausprobieren (http://amoffat.github.io/sh/).

import sh
print sh.which('ls')  # gibt je nach Ihrer Konfiguration '/bin/ls' aus
print sh.which('xxx') # gibt None aus

0voto

jfs Punkte 370717

Es gibt ein which.py Skript in einer Standard-Python-Verteilung (z. B. unter Windows '\PythonXX\Tools\Scripts\which.py').

Bearbeiten: which.py hängt von ls ab, daher ist es nicht plattformübergreifend.

-1voto

zgoda Punkte 12611

Im Grunde genommen möchten Sie eine Datei im eingebundenen Dateisystem finden (nicht unbedingt nur in den PATH-Verzeichnissen) und überprüfen, ob sie ausführbar ist. Dies führt zu folgendem Plan:

  • alle Dateien in lokal eingebundenen Dateisystemen auflisten
  • Ergebnisse mit dem Dateinamenmuster abgleichen
  • für jede gefundene Datei überprüfen, ob sie ausführbar ist

Ich würde sagen, dies auf eine portable Weise zu tun, erfordert viel Rechenleistung und Zeit. Ist das wirklich das, was Sie brauchen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X