建立 Python 和 Bash 友谊:smart-env 和 python-shell 库

大家好日子。

如今,Python 是最常用的语言之一,不仅用于创建软件产品本身,还提供其基础设施。 结果,许多开发人员无论自愿还是反对,都必须学习一门新语言,以便以后用作旧的 Bash 脚本的补充。 然而,Bash 和 Python 的代码编写方法不同,并且具有某些特性,这意味着将 Bash 脚本移植到“蛇语言”有时会是一项艰巨且绝非微不足道的任务。

为了让 DevOps 的工作变得更轻松,Python 中已经创建并继续创建了许多有用的库和实用程序。 本文介绍了本文作者创建的两个新库 - 智能环境 и 蟒蛇壳 - 旨在使开发人员无需过多关注使用 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

这个想法是这样的:

  1. 代表 Python 世界中的 Bash 的单个类;
  2. 每个 Bash 命令都作为 Shell 类的函数来调用;
  3. 然后将每个函数调用的参数传递到相应的 Bash 命令调用中;
  4. 每个命令在调用时“此时此地”执行,即同步方法有效;
  5. 可以访问 stdout 中命令的输出及其返回码;
  6. 如果该命令不在系统中,则会抛出异常。

与 smart-env 一样,支持 Python 2(尽管需要付出更多牺牲),但不支持 Python 3.0-3.4。

图书馆发展计划

您现在可以使用这些库:它们都发布在官方 PyPI 上。 源代码可在 Github 上找到(见下文)。

这两个库的开发都将考虑从感兴趣的人那里收集的反馈。 而且,如果在 smart-env 中想出各种新功能可能很困难,那么在 python-shell 中肯定还需要添加其他内容:

  • 支持非阻塞调用;
  • 与团队互动沟通的可能性(使用标准输入);
  • 添加新属性(例如,从 stderr 接收输出的属性);
  • 实现可用命令的目录(与 dir() 函数一起使用);
  • 等等

引用

  1. 智能环境库: Github上 и 的PyPI
  2. python-shell 库: Github上 и 的PyPI
  3. 电报频道 图书馆更新

UPD 23.02.2020:
* 存储库已移动,相应的链接已更新
* 版本 python-shell==1.0.1 正在准备于 29.02.2020 年 XNUMX 月 XNUMX 日发布。 更改包括对命令自动完成和 dir(Shell) 命令的支持、使用无效 Python 标识符运行命令以及错误修复。

来源: habr.com

添加评论