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

Joe*_*Joe 19 python shell operating-system

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

joe*_*ler 32

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

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'
Run Code Online (Sandbox Code Playgroud)

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

  • 版本3.3的sputil.which实现的Python源代码(只有几十行):http://hg.python.org/cpython/file/6860263c05b3/Lib/shutil.py#l1068 (3认同)
  • 可在此处获得Backport:https://github.com/mbr/shutilwhich (3认同)
  • 到 2021 年,这应该是公认的答案。 (3认同)
  • 如果您将第1110行更改为`if any([cmd.lower().endswith(ext.lower())for ext in pathext])`(将生成器转换为列表),而不是在python 2.7中工作. (2认同)

Six*_*Six 15

Python 2和3的一个选项:

from distutils.spawn import find_executable

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

find_executable('does_not_exist')  # None
Run Code Online (Sandbox Code Playgroud)

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

请记住,与实际上不一样which,find_executable不会检查结果是否标记为可执行文件.os.access(path, os.X_OK)如果您想确定subprocess.Popen能够执行该文件,您可能需要打电话来自行检查.


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

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

from whichcraft import which

which('wget')  # '/usr/bin/wget'
Run Code Online (Sandbox Code Playgroud)


Abh*_*jit 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'
Run Code Online (Sandbox Code Playgroud)