2012-03-26 39 views
11

Dicho de otra manera, ¿existe una forma multiplataforma de saber qué archivo se ejecutará por subprocess.Popen(file) sin primero haberlo ejecutado?¿Existe un Python equivalente al comando 'which'

+2

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

+0

Por defecto, el subproceso inherents el entorno del proceso padre. Por lo tanto, para cualquier ejecutable en el PATH (o el SO en el equivalente de la pregunta) no es necesario que especifique la ubicación. –

+0

@JoshLee parece que PBS ya no está disponible. – Joe

Respuesta

8

creo que no hay ninguno en las bibliotecas de 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' 
24

Python 3.3 añadió shutil.which() para proporcionar un medio multiplataforma de archivos ejecutables que descubren:

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

devuelve la ruta hasta un ejecutable que se ejecutaría si se llamara el cmd dado. Si no se llamará a ningún cmd, devuelva None.

llamadas muestra:

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

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

Desafortunadamente, esto no ha sido portado a 2.7.x.

+2

Fuente de Python para la implementación de la versión 3.3 de shutil.which (solo unas pocas docenas de líneas): http: // hg .python.org/cpython/file/6860263c05b3/Lib/shutil.py # l1068 – joemaller

+1

si cambia la línea 1110 a 'if any ([cmd.lower(). endswith (ext.lower()) para ext en pathext]) '(ponga el generador en una lista) de lo que funcionará en Python 2.7. – cdhagmann

+2

Backport disponible aquí: https://github.com/mbr/shutilwhich –

7

Una opción para Python 2 y 3:

from distutils.spawn import find_executable 

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

find_executable('does_not_exist') # None 

find_executable(executable, path=None) simplemente trata de encontrar 'ejecutable' en los directorios listados en 'camino'. El valor predeterminado es os.environ['PATH'] si 'ruta' es None. Devuelve la ruta completa a 'ejecutable' o None si no se encuentra.

Tenga en cuenta que a diferencia de which, find_executable en realidad no verifica que el resultado esté marcado como ejecutable. Es posible que desee llamar al os.access(path, os.X_OK) para verificarlo por su cuenta si quiere estar seguro de que subprocess.Popen podrá ejecutar el archivo.


También hay que resaltar, shutil.which de Python 3.3+ se ha portado y puesto a disposición para Python 2.6, 2.7, 3.x a través del módulo 3 ª parte whichcraft.

Está disponible para su instalación a través de la página mencionada de GitHub (es decir, pip install git+https://github.com/pydanny/whichcraft.git) o el índice del paquete Python (es decir, pip install whichcraft). Se puede utilizar como tales:

from whichcraft import which 

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