【问题标题】:How to get in Python the path to a installed program in windows如何在 Python 中获取 Windows 中已安装程序的路径
【发布时间】:2014-12-08 09:03:26
【问题描述】:

我正在用 Python 编写一个在 Windows 终端中调用 Ghostscript 的脚本。

我需要获取程序在 windows 中的安装路径(例如 Ghostcript)

有任何环境变量或任何其他方法(系统注册表)来获取路径?

解决方案(来自@abarnert 回答:)

    import winreg

    program_to_found = 'Software\\GPL Ghostscript'

    try:
        h_key = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE, program_to_found)
        try:
            gs_version = winreg.EnumKey(h_key, 0)
            h_subkey = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, program_to_found+'\\'+gs_version)
            gs_dll = (winreg.EnumValue(h_subkey,0))[1]
            print("Ghostscript %s is installed in: %s" % (gs_version, gs_dll.replace('gsdll32.dll', '')))
        except OSError:
            print("Ghostscript insn't correctly installed!! ")
    except PermissionError:
        print("Ghostsript not found!! ")

这适用于winXP和win7 32位系统。

【问题讨论】:

  • 你需要这个做什么?如果 Ghostscript 的路径在您的 %PATH% 上,您应该可以将其作为裸名运行。如果不是(也就是说,您不能直接从 cmd 窗口使用它),Windows 一般可能无法告诉您。但是……如果 Ghostscript 已将自身安装为处理程序,例如,.ps 文件,您可以通过这种方式在注册表中搜索它。或者,如果它有任何它总是创建的已知注册表项。
  • Ghostscript 不会更改 Win 中的 %PATH%。当我调用 Ghostscript 时,我需要使用完整路径来调用它,并且我不想更改脚本用户的 %PATH%。
  • 好的,那么没有通用的方法来“获取已安装程序的路径”。正如我之前的评论所暗示的,有一些方法可以从文件类型关联、.msi 安装记录等中获取路径,当然还有 Ghostscript 放入注册表中的任何自定义。但是,如果一个程序有一个自定义的 .exe 安装程序,不创建任何文件类型关联,也不向注册表写入任何内容,则无需查找任何内容。

标签: python windows installation exe


【解决方案1】:

你所要求的是不可能的一般。 Windows 找不到任意安装的程序。但它可能适用于任何特定应用程序,包括 Ghostscript。

通过 .msi 机制安装的程序或与“添加/删除程序”中的“卸载”机制交互的其他程序,您可以找到相应的条目。但是具有自己的自定义安装程序和卸载程序的程序不必这样做。

可以通过这些关联找到添加“文件类型关联”的程序(例如,如果您双击 .ps 文件,Windows 知道如何打开它)。

当然,许多程序会安装自己的任意注册表项,您可以随时搜索。

如果您查看Ghostscript installation docs,它会稍微解释一下它的作用。我认为简短的版本是:

  • 有一个选项可以将GS.EXE 所在的目录添加到您的%PATH% 中,但在您的情况下,显然它不存在。
  • 可以选择将GS.EXE 的路径注册为至少.ps 文件的文件类型关联,除非其他人已经拥有它。
  • GSDLL32.DLL 的路径可以在GS_DLL 环境变量或HKCU\Software\GPL Ghostscript\#.##HKLM\Software\GPL Ghostscript\#.## 中找到(其中#.## 是主要和次要版本号)。当然,不能保证 DLL 和 EXE 位于同一位置(这就是为什么它首先要做所有复杂的事情)。
  • 卸载程序的路径已注册到 Windows 卸载程序机制。当然,不能保证GS.EXE 与卸载程序位于同一目录中。

由于几乎所有这些都是可选的,因此这取决于您要付出多少努力来尝试所有不同的可能性。

要从 Python 访问这些注册表项,请参阅 stdlib 中的 _winreg 模块。

【讨论】:

  • 那么,如何从我的 Python 脚本中获取 HKEY_LOCAL_MACHINE\SOFTWARE\GPL Ghostscript\#.## 值?
  • @Trimax:参见winreg 模块。你必须CreateKeyGPL Ghostscript,然后EnumKey才能找到正确的版本号。
  • 它在 Python 2 中被命名为 _winreg 模块。
  • @martineau:抱歉,请使用我的链接,而不是我的文字。 :)
【解决方案2】:

您可以通过这种方式获取 GhostScript bin 文件夹的路径:

from winreg import OpenKey, QueryValue, EnumKey, HKEY_LOCAL_MACHINE, KEY_READ

def get_ghostscript_path():  # function returns Ghostscript bin folder path
        key = r'SOFTWARE\Artifex\GPL Ghostscript'
        sub_key = OpenKey(HKEY_LOCAL_MACHINE, key, access=KEY_READ)
        return QueryValue(HKEY_LOCAL_MACHINE, f'{key}\\{EnumKey(sub_key, 0)}') + r'\bin'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多