检测Python3脚本中是否安装了某个程序

在我的Python3软件中,我需要检查是否安装了Git。我知道从终端可以输入以下命令:
dpkg --get-selections > filename

查找已安装的程序并将其放入文件中。

从那里,我该如何让Python查看是否安装了Git?还是有更简单的方法吗?


使用终端命令并将其放入文件中并不能起作用,因为如果您卸载一个程序,该文件仍然存在,但同一行上的单词变为"deinstalled"而不是"installed"。 - Eden Crow
要使用终端命令,但更轻松地执行它,您可以执行以下操作:“dpkg -s git”。如果已安装,则会获取软件包详细信息;如果未安装,则会显示“Package 'git' is not installed and no info is available”。 - Alin Andrei
6个回答

您可以使用Python的apt模块,但它只会检查软件包是否已安装。它无法在非deb发行版上运行,或者在包管理器之外安装的情况下无法正常工作。
import apt
cache = apt.Cache()
cache.open()
 cache["git-core"].is_installed# Evaluates true if git is installed

尝试运行 Git,并在失败时处理异常。
import subprocess

try:
    # pipe output to /dev/null for silence
    null = open("/dev/null", "w")
    subprocess.Popen("git", stdout=null, stderr=null)
    null.close()

except OSError:
    print("git not found")

第三个选项是尝试在$PATH中的所有路径上,并测试您是否对path/git具有执行权限。

1如果你使用subprocess.DEVNULL而不是dev设备,这个答案在Windows CPython上也可以工作。git_found = subprocess.call(['git', '--version'], stdout=subprocess.DEVNULL) != 0 - Liam Dawson

查找已安装的文件

假设我们知道应用程序的启动器或二进制文件的默认安装位置,一个简单的方法就是检查其是否存在:

#! /usr/bin/env python3
#
# Query package state by installation path

import os.path
path = '/usr/bin/git'


def query_package(path):
    if os.path.exists(path):
        print('Git is ready to use')
    else:
        print('please install Git')

咨询DPKG

然而,查询已安装的软件包的另一种方法是咨询软件包管理器,在我们的情况下是dpkg:

#! /usr/bin/env python3
#
# Query package state by dpkg status

import subprocess
package = 'git'

def query_package(package):
    status = subprocess.getstatusoutput("dpkg-query -W -f='${Status}' " + package)
    if not status[0]:
        print(status[1]) # package is installed
    else:
        print(status[1])

如果你想以那种方式做,你可以这样做:
checkvar = 0 for line in open("filename"): if "git" in line: checkvar = checkvar + 1 print "找到 git 这个词", checkvar, "次"

我会采用不同的方法。为了检查给定系统上是否可用Git,请检查用户的PATH中是否存在git二进制文件,或者尝试执行git --version。这种检查更可靠,并支持那些因各种原因在/usr/local/bin或者~/bin安装Git的人。

这并不是对你问题的直接回答,但我希望它能有所帮助。如果你需要在Python中编写代码的帮助,请告诉我,我会提供更多详细信息。


听起来很合理,但是我该如何让Python判断Git是否真的存在呢? - Eden Crow
尝试使用subprocess.Popen()运行它,并在失败时处理异常。我已经更新了我的答案。 - Egil

你也可以尝试检查which的输出。
(也许这个方法不会奏效,因为没有其他人提过这个建议?)

"which"是一个内置于shell中的命令,所以您首先需要生成一个shell。 - Adam Byrtek
/usr/bin/which 不是一个内置的 shell 命令,除非我搞错了。 - Broam
对,这是Zsh(我使用的)中的内置功能。对此表示抱歉。 - Adam Byrtek

TLDR: 截至2022年,使用subprocess模块(非常棒)!这是一行代码:

import subprocess; subprocess.run(["git", "--version"], stdout=subprocess.DEVNULL, check=True)

subprocess模块:

subprocess模块是Python作为一个令人惊叹的脚本语言的典范!我在所有可能导致Shell脚本难以维护和混乱的情况下都使用它。

顺便说一下,这是你现在应该使用的Python v3.5+的更新代码片段:

import subprocess

subprocess.run(["git", "--version"], stdout=subprocess.DEVNULL, check=True)

你所需要的只是subprocess.run()函数:

在Python v3.5中引入的run()函数是你从Python脚本中调用工具所需的全部。此外,它的check参数会在进程以非零代码退出时抛出CalledProcessError异常。因此,你可以通过将True传递给run()函数的check参数来轻松检查工具是否已安装。