2012-03-26 3 views
11

Innymi słowy, czy istnieje międzyplatformowy sposób sprawdzenia, który plik zostanie wykonany przez subprocess.Popen(file) bez wcześniejszego wykonania?Czy istnieje odpowiednik w języku Python dla polecenia "which"?

+2

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

+0

Domyślnie podproces inherents środowiska procesu nadrzędnego. Tak więc dla każdego pliku wykonywalnego w PATH (lub systemu operacyjnego w odpowiedniku) nie trzeba określać lokalizacji. –

+0

@JoshLee wygląda jak PBS nie jest już dostępny. – Joe

Odpowiedz

8

wierzę, nie ma nikogo w bibliotekach Pythona

>>> 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 dodaje shutil.which() aby zapewnić środki wieloplatformowe odkrywania wykonywalnych:

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

Return droga do plik wykonywalny, który zostanie uruchomiony, jeśli zostanie wywołany określony cmd. Jeśli nie zostanie wywołane polecenie cmd, zwróć Brak.

Przykładowe połączenia:

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

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

Niestety, nie została przeniesiona do 2.7.x.

+2

Źródło Pythona dla implementacji shutila w wersji 3.3. Co jest tutaj (tylko kilkadziesiąt wierszy): http: // hg .python.org/cpython/file/6860263c05b3/Lib/shutil.py # l1068 – joemaller

+1

jeśli zmienisz wiersz 1110 na 'if any ([cmd.lower(). endswith (ext.lower()) for ext in pathext]) '(zmień generator na listę), niż będzie działać w pythonie 2.7. – cdhagmann

+2

Backport dostępny tutaj: https://github.com/mbr/shutilwhich –

7

Opcja dla Pythona 2 i 3:

from distutils.spawn import find_executable 

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

find_executable('does_not_exist') # None 

find_executable(executable, path=None) prostu próbuje znaleźć „wykonywalny” w katalogach wymienionych w ścieżce „”. Domyślnie os.environ['PATH'], jeśli "ścieżka" to None. Zwraca pełną ścieżkę do "pliku wykonywalnego" lub None, jeśli nie zostanie znaleziony.

Należy pamiętać, że w przeciwieństwie do which, find_executable faktycznie nie sprawdza, czy wynik jest oznaczony jako plik wykonywalny. Możesz zadzwonić pod numer os.access(path, os.X_OK), aby to sprawdzić samodzielnie, jeśli chcesz mieć pewność, że subprocess.Popen będzie w stanie wykonać plik.


Warto też wspomnieć, shutil.which Python 3.3+ zostało przeniesione i udostępnione dla Pythona 2.6, 2.7 i 3.x poprzez moduł 3rd partii whichcraft.

Jest on dostępny do instalacji przez wspomnianą wcześniej stronę GitHub (tj. pip install git+https://github.com/pydanny/whichcraft.git) lub indeks pakietu Python (tj. pip install whichcraft). Może być używany jak takie:

from whichcraft import which 

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