用Python制作你自己的Shell

很多人讨厌bash脚本。每当我要做最简单的事情时,我都必须查阅文档。如何将函数的参数转发给子命令?如何将字符串分配给变量,然后作为命令调用该字符串?如何检查两个字符串变量是否相等?如何分割字符串并获得后半部分?等等。不是我找不到这些答案,而是每次都必须查找它们。

但是,我们不能否认将整个程序当作纯粹的功能发挥作用的能力,以及将一个程序的输出传递到另一个程序的自然程度。因此,我想知道,我们能否将bash的某些功能与Python结合起来?

基础知识

让我们从一个类开始。这是一个简单的方法,将其初始化参数保存到局部变量,然后使用subprocess.run对其自身进行延迟求值并保存结果。


  1. import subprocess  
  2. class PipePy:  
  3.     def __init__(self, *args):  
  4.         self._args = args  
  5.         self._result = None  
  6.     def _evaluate(self):  
  7.         if self._result is not None:  
  8.             return  
  9.         self._result = subprocess.run(self._args,  
  10.                                       capture_output=True 
  11.                                       text=True 
  12.      @property  
  13.     def returncode(self):  
  14.         self._evaluate()  
  15.         return self._result.returncode  
  16.     @property  
  17.     def stdout(self):  
  18.         self._evaluate()  
  19.         return self._result.stdout  
  20.     def __str__(self):  
  21.         return self.stdout  
  22.     @property  
  23.     def stderr(self):  
  24.         self._evaluate()  
  25.         return self._result.stderr 

我们让它旋转一下:


  1. ls = PipePy('ls')  
  2. ls_l = PipePy('ls', '-l')  
  3. print(ls)  
  4. <<< files.txt  
  5. # … main.py  
  6. # … tags  
  7. print(ls_l)  
  8. <<< total 16  
  9. # … -rw-r–r– 1 kbairak kbairak  125 Jan 22 08:53 files.txt  
  10. # … -rw-r–r– 1 kbairak kbairak 5425 Feb  1 21:54 main.py  
  11. # … -rw-r–r– 1 kbairak kbairak 1838 Feb  1 21:54 tags 

使其看起来更像“命令式”

不用每次我们要自定义命令时都去调用PipePy。

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章