是否有与“which”命令等效的 Python [重复]

Posted

技术标签:

【中文标题】是否有与“which”命令等效的 Python [重复]【英文标题】:Is there a Python equivalent to the 'which' command [duplicate] 【发布时间】:2012-04-10 06:31:04 【问题描述】:

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

【问题讨论】:

github.com/amoffat/pbs/blob/master/pbs.py#L95 默认情况下,子进程固有父进程的环境。因此,对于 PATH 中的任何可执行文件(或相关操作系统的等效项),您无需指定位置。 @JoshLee 看起来 PBS 不再可用。 github.com/amoffat/sh/blob/master/sh.py#L162 【参考方案1】:

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。

【讨论】:

Python 3.3 版本的shutil 实现源码在这里(只有几十行):hg.python.org/cpython/file/6860263c05b3/Lib/shutil.py#l1068 如果将第 1110 行更改为 if any([cmd.lower().endswith(ext.lower()) for ext in pathext])(将生成器转换为列表),它将在 python 2.7 中工作。 可在此处获得后端:github.com/mbr/shutilwhich shutil.which 也很慢 在 2021 年,这应该是公认的答案。【参考方案2】:

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) 只是尝试在“路径”中列出的目录中查找“可执行文件”。如果“路径”为None,则默认为os.environ['PATH']。如果未找到,则返回“可执行文件”或 None 的完整路径。

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


另外值得注意的是,Python 3.3+ 的shutil.which 已通过第 3 方模块 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'

【讨论】:

避免使用 distutils,因为它使用了已弃用的 imp 会产生运行时警告。【参考方案3】:

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

【讨论】:

以上是关于是否有与“which”命令等效的 Python [重复]的主要内容,如果未能解决你的问题,请参考以下文章

是否有与 Grails 的 Rails 命令/功能“rake routes”等效的功能?

是否有与 Ruby 符号等效的 Python?

是否有与 Ruby 的字符串插值等效的 Python?

是否有与 Python 的 @property 装饰器等效的 C++11?

是否有与 Python 的 cProfile 等效的 Julia 分析器?

是否有与 Rails bundler-audit 等效的 Python/Django?