我们成为Python和Bash的朋友:smart-env和python-shell库

祝大家有美好的一天。

如今,Python不仅是直接创建软件产品,而且还提供其基础架构领域最常用的语言之一。结果,许多开发人员出于自己的意愿或违背它,不得不学习一种新的语言,以供以后更好地使用旧的Bash脚本。但是,Bash和Python拥有不同的代码编写方法并具有某些功能,因此将Bash脚本移植到“蛇形语言”有时是一项繁重的工作,而且并非一件容易的事。

为了使开发人员的工作更轻松,已创建并继续创建Python中许多有用的库和实用程序。本文立即介绍了本文作者创建的两个新库-smart-envpython- shell-旨在免除开发人员的工作量,因为他们无需过多关注使用Python的复杂性,从而为执行更多有趣的任务留出了空间。该库的范围是环境变量和外部实用程序的启动。

请有兴趣的人在猫下。

新自行车?


看来,为什么要为平凡的操作创建新的程序包?是什么阻止直接使用os.environ和子进程<您选择的方法或类>?

我将分别支持每个库。

智能环境库


在编写自己的创意之前,上网冲浪并寻找现成的解决方案非常有用。当然,有可能找不到您需要的东西,而是“保险案”。通常,该方法行之有效,并节省了大量时间和精力。

根据搜索结果,发现了以下内容:

  • 有些包实际上包装了对os.environ的调用,但是同时需要执行许多分散注意力的操作(创建类的实例,调用中的特殊参数等);
  • 但是,有一些好的软件包与特定的生态系统(主要是Django之类的Web框架)紧密地联系在一起,因此没有文件就不是通用的。
  • 很少有尝试做新的事情。例如,添加类型并通过调用以下形式的方法显式解析变量值

    get_<typename>(var_name)

    或者,这是另一种解决方案,但是目前不支持不受欢迎的Python 2(尽管有官方RIP,但在其上仍然有大量的书面代码和整个生态系统);
  • 那里有学生手工艺品,一点也不清楚,为什么它们最终出现在上游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变量)。但是现在不需要显式转换行了-大多数必需的动作已经嵌入在库的肠子中,并且仅在等待发出动作的信号。 :)通常,键入透明地起作用,并且几乎支持所有可用的内置数据类型(冻结集,复数和字节未经测试)。

对Python 2的支持要求几乎没有付出任何代价(在最新版本的Python 3中放弃了键入和一些糖果),特别是由于存在无处不在的六个(解决了使用元类的问题)。

但是有一些限制:

  • 对Python 3的支持意味着版本为3.5或更高版本(它们在项目中的存在是由于懒惰或缺乏改进的结果,因为很难提出仍然使用3.4的客观原因);
  • 在Python 2.7中,该库不支持集合文字的反序列化。在这里说明但是,如果有人想实施-欢迎:);

在解析错误的情况下,该库还提供了一种异常机制。如果任何可用的分析器都不能识别字符串,则该值仍为字符串(出于方便和与Bash变量的常规逻辑向后兼容的原因)。

Python-shell库


现在,我将讨论第二个库(我将省略对可用类似物的缺点的描述-它类似于对smart-env。Analogs的描述- 在此处此处)。

通常,实现的思想和要求与为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中访问exhaust命令及其返回代码;
  6. 如果系统中没有该命令,则会引发异常。

与smart-env一样,提供了对Python 2的支持(尽管花费了更多的精力),并且不支持Python 3.0-3.4。

图书馆发展计划


您现在可以使用这些库:两者都在官方PyPI上进行了布局。来源可在Github上找到(见下文)。

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

  • 支持无阻塞呼叫;
  • 与团队进行互动交流的可能性(与stdin合作);
  • 添加新属性(例如,从stderr中获取资源的属性);
  • 实现可用命令的目录(与dir()函数一起使用);
  • 等等

参考文献


  1. Smart-env库:GithubPyPI
  2. Python-shell库:githubpypi
  3. 电报频道,用于图书馆更新


UPD 02/23/2020:
*存储库已移动,相应的链接已更新
* python-shell版本== 1.0.1正在准备于02/29/2020发行。其中的更改包括对命令和dir(Shell)命令的自动完成的支持,带有Python无效标识符的命令的启动以及错误修复。

UPD 03/01/2020:
* 发布在下一个版本中。

All Articles