Is er een Python-equivalent van het ‘welke’-commando [duplicate]

Anders gezegd, is er een platformonafhankelijke manier om te weten welk bestand zal worden uitgevoerd door subprocess.Popen(file)zonder het eerst uit te voeren?


Antwoord 1, autoriteit 100%

Ik geloof dat er geen in de Python-bibliotheken is

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

Antwoord 2, autoriteit 94%

Python 3.3 heeft shutil.which()toegevoegd om een ​​platformonafhankelijke manier te bieden om uitvoerbare bestanden te ontdekken:

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

Retourneer het pad naar een uitvoerbaar bestand dat zou worden uitgevoerd als de opgegeven cmd werd aangeroepen. Als er geen cmd zou worden aangeroepen, retourneer dan Geen.

Voorbeeldoproepen:

>>> shutil.which("python")
'/usr/local/bin/python'
>>> shutil.which("python")
'C:\\Python33\\python.EXE'

Helaas is dit niet teruggezet naar 2.7.x.


Antwoord 3, autoriteit 90%

Een optie voor Python 2 en 3:

from distutils.spawn import find_executable
find_executable('python')  # '/usr/bin/python'
find_executable('does_not_exist')  # None

find_executable(executable, path=None)probeert gewoon ‘executable’ te vinden in de mappen vermeld in ‘path’. Standaard ingesteld op os.environ['PATH']als ‘path’ Noneis. Retourneert het volledige pad naar ‘uitvoerbaar’ of Noneindien niet gevonden.

Houd er rekening mee dat, in tegenstelling tot which, find_executableniet echt controleert of het resultaat als uitvoerbaar is gemarkeerd. Misschien wilt u os.access(path, os.X_OK)aanroepen om dat zelf te controleren als u er zeker van wilt zijn dat subprocess.Popenkan worden uitgevoerd het bestand.


Let ook op: shutil.whichvan Python 3.3+ is gebackporteerd en beschikbaar gemaakt voor Python 2.6, 2.7 en 3.x via de externe module whocraft.

Het is beschikbaar voor installatie via de bovengenoemde GitHub-pagina (dwz pip install git+https://github.com/pydanny/whichcraft.git) of de Python-pakketindex (dwz pip install whichcraft). Het kan als volgt worden gebruikt:

from whichcraft import which
which('wget')  # '/usr/bin/wget'

Other episodes