我是完整的Python初学者,请尝试编写 Python脚本,以自动从远程
该脚本首先执行一些基本的初步操作,尤其是几个软件包(git
,docker
,pip
等)的检查/设置。
就目前而言,我的目标客户是Debian( Stretch,Buster ),Centos(6、7)和Ubuntu Server 18.04LTS。 当然,我希望脚本在范围最广的Linux计算机上运行。
今天,我依靠可用的程序包管理器(apt-get
和yum
),它们是通过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模块绑定太多 ,但我想这里有一些更聪明的方法这样简单的操作?
答案 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])