猿问

文件相关操作python子进程vs.原生python

我想通过 ssh 执行一个简单的任务:返回给定文件列表中不存在的所有文件。

我这样做的方法是将以下内容包装在 ssh 会话中:

for f in $(files); do stat $f > /dev/null ;done

stdout 重定向将忽略所有好的文件,然后读取 stderr 将为我提供所有未找到文件的列表。

我首先想到将这个 bash 代码与 a 中的 ssh 部分一起使用,subprocess.run(..., shell=True)但不鼓励这样做。相反,paramiko有人建议。

我试图理解为什么以及何时原生 python 比子处理 bash 更好

  1. 不同操作系统的可计算性(对我来说不是问题,因为代码与 Ubuntu 紧密相关)

  2. 错误和异常处理 - 我确实得到并认为它很重要,尽管从子进程中捕获异常或退出代码也很容易

在我看来,原生 python 的缺点是当 bash 的 ssh 和 stat 在我看来更加简单易用时,需要涉及一些复杂的模块,例如 paramiko

是否有关于何时以及如何选择 bash 而不是 python 的指南?

这个问题主要是关于在 ssh 上使用命令,但与 bash 以简单快捷的方式执行的任何其他命令以及 python 换行有关


慕田峪9158850
浏览 112回答 1
1回答

交互式爱情

这里实际上有三种选择:在进程中做某事(如paramiko)、ssh 直接运行(使用subprocess)和ssh使用shell运行(也使用subprocess)。作为一般规则,避免以编程方式运行 shell(而不是根据交互式用户请求)。原因是它是一个以人为本的界面(因此很容易将单词与空格、快捷键$HOME和通配符分开)作为 API 的功能大大不足。例如,考虑一下您的代码如何检测到ssh丢失的情况:这种情况不会出现paramiko(只要它已安装),很明显subprocess,并且只是来自 shell 的(模棱两可的)退出代码和 stderr 消息。还要考虑如何提供要运行的命令:它必须是适合 shell 的命令(由于 SSH 协议的限制),但如果ssh 使用shell 调用,则必须对其进行编码(有时称为“双重转义”)以使本地 shell 的解释成为远程 shell 所需的多字命令。到目前为止,paramiko几乎subprocess是等价的。作为一个更困难的情况,考虑密钥验证失败将如何表现:paramiko将失败描述为data,而其他人将尝试与用户交互(可能存在也可能不存在)。 paramiko还支持在一个经过身份验证的连接上打开多个通道;ssh这样做也是如此,但只能通过ControlMaster涉及 Unix 套接字文件的复杂配置(在某些部署中可能没有任何好地方存在)。说到配置,如果在设计时没有考虑到这种自动化用例,您可能需要通过-F以避免用户的复杂性。.ssh/config总之,库是为像您这样的用例而设计的,因此它们比从面向人类的命令组装您自己的界面(尽管这种手动组合非常有用)更好地工作也就不足为奇了,特别是对于边缘情况可能!)。如果安装一个非标准的依赖喜欢paramiko是一种负担,至少直接使用subprocess;去掉第二个壳已经是很大的进步了。
随时随地看视频慕课网APP

相关分类

Python
我要回答