2012-03-26 8 views
11

Anders ausgedrückt, gibt es einen plattformübergreifenden Weg zu wissen, welche Datei von subprocess.Popen(file) ausgeführt wird, ohne sie zuvor auszuführen?Gibt es ein Python-Äquivalent zum Befehl 'which'?

+2

https://github.com/amoffat/pbs/blob/master/pbs.py#L95 –

+0

standardmäßig subprocess inherents die Umgebung des übergeordneten Prozesses. Für jede ausführbare Datei im PATH (oder dem entsprechenden OS) müssen Sie den Speicherort nicht angeben. –

+0

@JoshLee sieht aus wie PBS ist nicht mehr verfügbar. – Joe

Antwort

8

Ich glaube, es ist keine in den Python-Bibliotheken

>>> def which(pgm): 
    path=os.getenv('PATH') 
    for p in path.split(os.path.pathsep): 
     p=os.path.join(p,pgm) 
     if os.path.exists(p) and os.access(p,os.X_OK): 
      return p 


>>> os.which=which 
>>> os.which('ls.exe') 
'C:\\GNUwin32\\bin\\ls.exe' 
24

Python 3.3 shutil.which() eine plattformübergreifende Mittel zu entdecken, ausführbare Dateien zur Verfügung zu stellen hinzugefügt:

http://docs.python.org/3.3/library/shutil.html#shutil.which

Rückkehr der Weg zum eine ausführbare Datei, die ausgeführt würde, wenn der angegebene cmd aufgerufen würde. Wenn kein cmd aufgerufen würde, gebe None zurück.

Beispiel Anrufe:

>>> shutil.which("python") 
'/usr/local/bin/python' 

>>> shutil.which("python") 
'C:\\Python33\\python.EXE' 

Leider hat dies nicht zu 2.7.x. zurückzuportiert

+2

Python-Quelle für die Version 3.3 von shutil.which ist hier (nur ein paar Dutzend Zeilen): http: // hg .python.org/cpython/file/6860263c05b3/Lib/shutil.py # l1068 – joemaller

+1

Wenn Sie die Zeile 1110 in 'if any ändern ([cmd.lower(). endswith (ext.lower()) für ext in pathext]) '(Drehen Sie den Generator zu einer Liste) als es in Python 2.7 funktioniert. – cdhagmann

+2

Backport hier verfügbar: https://github.com/mbr/shutilwhich –

7

Eine Option für Python 2 und 3:

from distutils.spawn import find_executable 

find_executable('python') # '/usr/bin/python' 

find_executable('does_not_exist') # None 

find_executable(executable, path=None) einfach versucht 'ausführbar' in den Verzeichnissen in 'Pfad' aufgelistet zu finden. Der Standardwert ist os.environ['PATH'], wenn 'Pfad' None ist. Gibt den vollständigen Pfad zu 'executable' zurück oder None, falls nicht gefunden.

Beachten Sie, dass im Gegensatz zu which, find_executable nicht wirklich überprüft, ob das Ergebnis als ausführbar markiert ist. Sie können os.access(path, os.X_OK) anrufen, um das selbst zu überprüfen, wenn Sie sicher sein wollen, dass subprocess.Popen die Datei ausführen kann.


Auch der Hinweis, shutil.which von Python 3.3+ wurde zurückportiert und für Python 2.6 zur Verfügung gestellt, 2.7 und 3.x über das 3rd-Party-Modul whichcraft.

Es ist verfügbar für die Installation über die oben erwähnte GitHub-Seite (d. H. pip install git+https://github.com/pydanny/whichcraft.git) oder den Python-Paket-Index (d. H. pip install whichcraft). Es kann wie solche verwendet werden:

from whichcraft import which 

which('wget') # '/usr/bin/wget' 
Verwandte Themen