是否有与“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”等效的功能?
是否有与 Python 的 @property 装饰器等效的 C++11?