是否有一个等效于'which'命令的Python

时间:2012-03-26 18:16:30

标签: python shell operating-system

换句话说,是否有一种跨平台的方式可以在不先执行的情况下知道subprocess.Popen(file)将执行哪个文件?

3 个答案:

答案 0 :(得分:30)

Python 3.3添加了shutil.which()以提供发现可执行文件的跨平台方法:

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

  

返回可执行文件的路径,如果调用了给定的cmd,该文件将运行。如果没有调用cmd,则返回None。

示例电话:

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

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

不幸的是,这还没有被移植到2.7.x。

答案 1 :(得分:13)

Python 2和3的选项:

from distutils.spawn import find_executable

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

find_executable('does_not_exist')  # None

find_executable(executable, path=None)只是试图找到可执行的'在'路径'中列出的目录中。如果'路径'默认为os.environ['PATH']None。返回“可执行文件”的完整路径。或None如果没有找到。

请注意,与which不同,find_executable实际上并未检查结果是否已标记为可执行。如果您想确定os.access(path, os.X_OK)能够执行该文件,您可以致电subprocess.Popen自行检查。

另外值得注意的是,Python 3.3+的shutil.which已被后移,并通过第三方模块whichcraft提供给Python 2.6,2.7和3.x.

可通过上述GitHub页面(即pip install git+https://github.com/pydanny/whichcraft.git)或Python包索引(即pip install whichcraft)进行安装。它可以这样使用:

from whichcraft import which

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

答案 2 :(得分:10)

我相信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'