使用Python的Linux软件包管理

时间:2019-08-22 13:37:42

标签: python linux package-managers

我是完整的Python初学者,请尝试编写 Python脚本,以自动从远程计算机上的 Linux 计算机上安装SDK。 em> Github 存储库。

该脚本首先执行一些基本的初步操作,尤其是几个软件包(gitdockerpip等)的检查/设置

就目前而言,我的目标客户是Debian( Stretch,Buster ),Centos(6、7)和Ubuntu Server 18.04LTS。 当然,我希望脚本在范围最广的Linux计算机上运行。

今天,我依靠可用的程序包管理器apt-getyum),它们是通过subprocess.call()语句粗略请求的。

我使用如下的 nasty 脚本配置变量来自定义相关命令:

    import platform

    distribution                    = platform.dist()[0]
    version                         = platform.dist()[1]

    if      distribution == 'debian':
            pkgInstaller            = 'dpkg'
            pkmManager              = 'apt-get'
            checkIfInstalled        = '-s'
            installPackage          = 'install'
            yesToAll                = '-y'
            dockerPackage           = 'docker-ce'
    elif    distribution == 'centos':
            pkgInstaller            = 'rpm'
            pkgManager              = 'yum'
            checkIfInstalled        = '-q'
            installPackage          = 'install'
            yesToAll                = '-y'
            dockerPackage           = 'docker'

然后我简单地循环遍历包含要安装的软件包的 names array ,然后通过subprocess.call()运行命令:

    prerequisites                   = ['git', dockerPackage, 'doxygen', 'python2-pip']

    for pkg in prerequisites:
        pgkInstallation = subprocess.call(['sudo', pkgManager, yesToAll, installPackage, pkg])

虽然这种方法的好处是不必与第三方 Python模块绑定太多 ,但我想这里有一些更聪明的方法这样简单的操作?

1 个答案:

答案 0 :(得分:1)

通常,当执行这样的switch语句时,字典可能会更有用。而且,通常我不是尝试PEP-8的人,但是在这种情况下,PEP-8可能通过不匹配所有代码行的等号来真正帮助您提高可读性。

dict会将您的distro用作键,并将vars作为包装在元组中的值

options = {
    'debian': ('dpkg', 'apt-get', '-s', 'install', '-y', 'docker-ce'),
    'centos': ('rpm', 'yum', '-q', 'install', '-y', 'docker'),
    }

# unpack this function call here
distribution, version, *_ = platform.dist() 


# now get the match
pkg_installer, pkg_manager, check, install_pkg, yes_to_all, docker = options[distribution]

requisites = ['git', docker, 'doxygen', 'python2-pip']

for pkg in requisites:
    pgkInstallation = subprocess.call(['sudo', pkg_manager, yes_to_all, install_pkg, pkg])

options[distribution]调用将针对不受支持的发行版引发KeyError,因此您可能会发现并提出一些更有用的内容,例如:

try:
    pkg_installer, pkg_manager, check, install_pkg, yes_to_all, docker = options[distribution]
except KeyError as e:
    raise ValueError(f"Got unsupported OS, expected one of {', '.join(options.keys())}") from e

为使其更简洁,您不按顺序使用的唯一变量是docker,因此您可以将所有其他变量放在一个变量中:

try:
    *args, docker = options[distribution]
except KeyError as e:
    raise ValueError(f"Got unsupported OS, expected one of {', '.join(options.keys())}") from e

requisites = ['git', docker, 'doxygen', 'python2-pip']

for pkg in requisites:
    pgkInstallation = subprocess.call(['sudo', *args, pkg])