如何在Python中找到可执行文件的位置?

8

什么是在Python中识别可执行文件的最佳方法?

我发现以下函数将找到记事本可执行文件

from shutil import which
which('notepad')

Out[32]: 'C:\\Windows\\system32\\notepad.EXE'

另一种方法来实现它。

from distutils import spawn
spawn.find_executable('notepad')

Out[38]: 'C:\\Windows\\system32\\notepad.exe'

虽然这两种方法适用于记事本,但我似乎无法找到其他可执行文件,比如vlc.exegimp-2.10.exe或者其他一些程序。有什么更好的方法可以在计算机上查找可执行文件吗?


1
请看这个问题:https://dev59.com/Syf_s4cB2Jgan1znRPpN - vcp
3
默认情况下,上述两种方法将搜索您的 PATH 以查找可执行文件。如果它们不在路径上,它自然无法找到它们。您究竟想要实现什么目标? - John Sloper
这个问题是在我帮助回答另一个问题时引发的。经过一些搜索,我找到了这些命令。 - Hojo.Timberwolf
3
您的问题似乎与Windows有关,并且涉及查找不一定在“PATH”上的可执行文件。也许可以编辑以澄清范围? - tripleee
3个回答

3
这里有一个平台无关且高效的方法来实现它:

最初的回答

import subprocess
import os
import platform

def is_tool(name):
    try:
        devnull = open(os.devnull)
        subprocess.Popen([name], stdout=devnull, stderr=devnull).communicate()
    except OSError as e:
        if e.errno == os.errno.ENOENT:
            return False
    return True

def find_prog(prog):
    if is_tool(prog):
        cmd = "where" if platform.system() == "Windows" else "which"
        return subprocess.call([cmd, prog])

4
popen 函数将执行一个进程,可能会导致创建日志文件、加载依赖库和其他不期望的行为。 - Andry
现在errno是一个独立的Python模块,必须通过import errno单独导入。 - MPEI_stud

1
以下是一段代码,可以帮助您检索必要的详细信息:
Windows Management Instrumentation(WMI)是微软对基于Web的企业管理(WBEM)的实现,这是一个行业倡议,为计算机系统的几乎所有信息提供了通用信息模型(CIM)。
import wmi as win_manage

w_instance = win_manage.WMI()
for details in w_instance.Win32_Product():
  print('Name=%s,Publisher=%s,Version=%s,' % (details.Caption, details.Vendor, details.Version))

0
我会借用answerfarshid-ashouri的观点(我声望不够,无法评论),补充一点:为了返回which/where调用的标准输出,我们需要使用subprocess.check_output,像这样:
def find_prog(prog):
    if is_tool(prog):
        cmd = "where" if platform.system() == "Windows" else "which"
        try:
            return subprocess.check_output([cmd, prog])
        except subprocess.CalledProcessError:
            return None

这将返回可执行文件的实际路径,这很可能是您想要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接