Există un echivalent Python al comenzii ‘which’ [duplicate] (Programare, Python, Shell, Sistem De Operare)

Joe a intrebat.

Altfel spus, există o modalitate transplatformă de a ști ce fișier va fi executat de către subprocess.Popen(file) fără a-l executa mai întâi?

Comentarii

3 răspunsuri
Abhijit

Cred că nu există în bibliotecile python

>>> 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'

joemaller

Python 3.3 adăugat shutil.which() pentru a oferi un mijloc de descoperire a executabilelor între platforme:

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

Returnează calea către un executabil care ar fi rulat dacă ar fi apelat cmd-ul dat. Dacă nu ar fi apelat niciun cmd, se returnează None.

Exemple de apeluri:

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

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

Din păcate, acest lucru nu a fost preluat în versiunea 2.7.x.

Comentarii

  • Sursa Python pentru implementarea shutil.which din versiunea 3.3 este aici (doar câteva zeci de linii): hg.python.org/cpython/file/6860263c05b3/Lib/shutil.py#l1068 –  > Por joemaller.
  • dacă schimbați linia 1110 în if any([cmd.lower().endswith(ext.lower()) for ext in pathext]) (transformați generatorul într-o listă) atunci va funcționa în python 2.7. –  > Por cdhagmann.
  • Backport disponibil aici: github.com/mbr/shutilwhich –  > Por nu everest.
  • shutil.which este, de asemenea, câine lent –  > Por Travis Bear.
  • În 2021 acesta ar trebui să fie răspunsul acceptat. –  > Por cjauvin.
Șase

O opțiune pentru Python 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) încearcă pur și simplu să găsească „executabil” în directoarele listate în „path”. Valoarea implicită este os.environ['PATH'] dacă „path” este None. Returnează calea completă către „executabil” sau None dacă nu este găsit.

Rețineți că, spre deosebire de which, find_executable nu verifică efectiv dacă rezultatul este marcat ca fiind executabil. Este posibil să doriți să apelați os.access(path, os.X_OK) pentru a verifica acest lucru de unul singur, dacă doriți să fiți sigur că subprocess.Popen va fi capabil să execute fișierul.


De asemenea, este de reținut, shutil.which din Python 3.3+ a fost retroportat și pus la dispoziție pentru Python 2.6, 2.7 și 3.x prin intermediul modulului 3rd-party whichcraft.

Acesta este disponibil pentru instalare prin intermediul paginii GitHub menționate mai sus (de ex. pip install git+https://github.com/pydanny/whichcraft.git) sau în indexul pachetelor Python (de ex. pip install whichcraft). Poate fi utilizat ca atare:

from whichcraft import which

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

Comentarii

  • Evitați distutils, deoarece a folosit imp depreciat, ceea ce creează un avertisment la execuție. –  > Por sorin.