大家好日子。
如今,Python 是最常用的语言之一,不仅用于创建软件产品本身,还提供其基础设施。 结果,许多开发人员无论自愿还是反对,都必须学习一门新语言,以便以后用作旧的 Bash 脚本的补充。 然而,Bash 和 Python 的代码编写方法不同,并且具有某些特性,这意味着将 Bash 脚本移植到“蛇语言”有时会是一项艰巨且绝非微不足道的任务。
为了让 DevOps 的工作变得更轻松,Python 中已经创建并继续创建了许多有用的库和实用程序。 本文介绍了本文作者创建的两个新库 -
新“自行车”?
看起来,为什么要为相当普通的操作创建新的包呢? 是什么阻止您直接使用 os.environ 和 subprocess.<method or class of your choice> ?
我将分别提供有利于每个图书馆的证据。
智能环境库
在编写自己的创意之前,上网查找现成的解决方案很有用。 当然,存在找不到你需要的东西的风险,但这更像是一个“保险事件”。 一般来说,这种方法很有效,并且可以节省大量时间和精力。
根据结果
- 有些包实际上包装了对 os.environ 的调用,但同时需要一堆分散注意力的操作(创建类的实例、调用中的特殊参数等);
- 有一些很好的包,但是它们严格依赖于特定的生态系统(主要是像 Django 这样的 Web 框架),因此如果没有文件就根本不通用;
- 很少有人尝试做新的事情。 例如,
添加打字 并通过调用类似方法显式解析变量值get_<typename>(var_name)
或者在这里
另一种解决方案 ,然而,它不支持现在不光彩的Python 2(尽管官方安息日 ,仍然有堆积如山的书面代码和整个生态系统); - 有学校学生的工艺,没有明显的原因它们最终出现在上游 PyPI 中,只会在新包的命名方面产生问题(特别是,名称“smart-env”是必要的措施)。
而且这个清单还可以持续很长时间。 然而,以上几点足以让我对制作方便且通用的东西的想法感到兴奋。
在编写 smart-env 之前设定的要求:
- 最简单的使用方案
- 易于配置的数据类型支持
- 兼容Python 2.7
- 通过测试良好的代码覆盖率
最终,这一切都实现了。 这是一个使用示例:
from smart_env import ENV
print(ENV.HOME) # Equals print(os.environ['HOME'])
# assuming you set env variable MYVAR to "True"
ENV.enable_automatic_type_cast()
my_var = ENV.MY_VAR # Equals boolean True
ENV.NEW_VAR = 100 # Sets a new environment variable
正如您从示例中看到的,要使用新类,您只需导入它(不需要创建实例 - 减去额外的操作)。 对任何环境变量的访问都是通过将其引用为 ENV 类的变量来实现的,这实际上使该类成为本机系统环境的直观包装器,同时将其转变为几乎任何系统的可能配置对象(例如,在 Django 中实现了类似的方法,只是配置对象是设置模块/包本身)。
启用/禁用自动类型支持模式是使用两种方法实现的:enable_automatic_type_cast() 和disable_automatic_type_cast()。 如果环境变量包含序列化的类似 JSON 的对象,甚至只是一个布尔常量,这会很方便(通过将环境变量与“有效”字符串进行比较来显式设置 Django 中的 DEBUG 变量是最常见的情况之一)。 但现在不需要显式转换字符串 - 大多数必要的操作已经嵌入到库的深处,只是等待信号来执行。 🙂 一般来说,输入是透明的,并且支持几乎所有可用的内置数据类型(frozenset、complex 和 bytes 未测试)。
支持 Python 2 的要求几乎没有做出任何牺牲(放弃输入和最新版本 Python 3 的一些“糖果”),特别是得益于无处不在的六种(解决使用元类的问题) )。
但有一些限制:
- Python 3 支持意味着 3.5 及更高版本(它们出现在你的项目中是因为懒惰或缺乏改进的需要,因为很难找出为什么你仍然使用 3.4 的客观原因);
- 在 Python 2.7 中,该库不支持集合文字的反序列化。 描述
这里 。 但如果有人想实现它,欢迎你:);
该库还有一个异常机制,以防解析错误。 如果任何可用的分析器都无法识别该字符串,则该值仍然是一个字符串(而是为了方便以及向后兼容变量在 Bash 中工作的通常逻辑)。
python-shell 库
现在我将向您介绍第二个库(我将省略对现有类似物的缺点的描述 - 它与 smart-env 的描述类似。类似物 -
总的来说,实现的思路和要求与smart-env的描述类似,从例子可以看出:
from python_shell import Shell
Shell.ls('-l', '$HOME') # Equals "ls -l $HOME"
command = Shell.whoami() # Equals "whoami"
print(command.output) # prints your current user name
print(command.command) # prints "whoami"
print(command.return_code) # prints "0"
print(command.arguments) # prints ""
Shell.mkdir('-p', '/tmp/new_folder') # makes a new folder
这个想法是这样的:
- 代表 Python 世界中的 Bash 的单个类;
- 每个 Bash 命令都作为 Shell 类的函数来调用;
- 然后将每个函数调用的参数传递到相应的 Bash 命令调用中;
- 每个命令在调用时“此时此地”执行,即同步方法有效;
- 可以访问 stdout 中命令的输出及其返回码;
- 如果该命令不在系统中,则会抛出异常。
与 smart-env 一样,支持 Python 2(尽管需要付出更多牺牲),但不支持 Python 3.0-3.4。
图书馆发展计划
您现在可以使用这些库:它们都发布在官方 PyPI 上。 源代码可在 Github 上找到(见下文)。
这两个库的开发都将考虑从感兴趣的人那里收集的反馈。 而且,如果在 smart-env 中想出各种新功能可能很困难,那么在 python-shell 中肯定还需要添加其他内容:
- 支持非阻塞调用;
- 与团队互动沟通的可能性(使用标准输入);
- 添加新属性(例如,从 stderr 接收输出的属性);
- 实现可用命令的目录(与 dir() 函数一起使用);
- 等等
引用
UPD 23.02.2020:
* 存储库已移动,相应的链接已更新
* 版本 python-shell==1.0.1 正在准备于 29.02.2020 年 XNUMX 月 XNUMX 日发布。 更改包括对命令自动完成和 dir(Shell) 命令的支持、使用无效 Python 标识符运行命令以及错误修复。
来源: habr.com