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"?
Odpowiedz
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'
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.
Ź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
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
Backport dostępny tutaj: https://github.com/mbr/shutilwhich –
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'
https://github.com/amoffat/pbs/blob/master/pbs.py#L95 –
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. –
@JoshLee wygląda jak PBS nie jest już dostępny. – Joe