gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:06:25 25 4
gpt4 key购买 nike

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

我执行此操作的方法是将以下内容包装在 ssh session 中:

for f in $(files);执行 stat $f >/dev/null ;完成

标准输出重定向将忽略所有好的文件,然后读取标准错误将为我提供所有未找到文件的列表。

我首先想到在 subprocess.run(..., shell=True) 中使用此 bash 代码和 ssh 部分,但不鼓励这样做。相反,建议使用paramiko

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

  1. 不同操作系统的可计算性(对我来说不是问题,因为代码与 Ubuntu 紧密相关)
  2. 错误和异常处理 - 我确实明白这一点并且认为它很重要,尽管从子进程捕获异常或退出代码也很容易

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

对于何时以及如何选择 bash 而不是 python 有任何指导吗?

这个问题主要是关于通过 ssh 使用命令,但与 bash 以简短而简单的方式执行且 python 包装的任何其他命令相关

最佳答案

这里实际上有三种选择:进程内做一些事情(例如paramiko),运行ssh直接> (使用subprocess),并使用shell(也使用subprocess)运行ssh。作为一般规则,避免以编程方式运行 shell(而不是根据交互式用户请求)。

原因是它是一个以人为本的界面(因此可以轻松地用空格分隔单词以及 $HOME 和通配符的快捷方式),但作为API。例如,考虑一下您的代码如何检测 ssh 丢失:paramiko 就不会出现这种情况(只要 it 是安装),对于 subprocess 来说是显而易见的,并且只是来自 shell 的(不明确的)退出代码和 stderr 消息。还要考虑如何提供要运行的命令:它必须是适合 shell 的命令(由于 SSH 协议(protocol)的限制),但如果您调用 ssh with shell 必须对其进行编码(有时称为“双重转义”),以便本地 shell 的解释成为远程 shell 所需的多字命令。

到目前为止,paramikosubprocess 几乎是等效的。作为一种更困难的情况,请考虑 key 验证失败如何表现:paramiko 会将失败描述为数据,而其他人会尝试将失败描述为数据。与用户交互(可能存在也可能不存在)。 paramiko 还支持通过一个经过身份验证的连接打开多个 channel ; ssh 也可以这样做,但只能通过涉及 Unix 套接字文件的复杂 ControlMaster 配置(在某些部署中可能没有任何合适的位置存在)。说到配置,如果用户的 .ssh/config 的设计没有考虑到此自动化用例,您可能需要传递 -F 以避免用户的 .ssh/config 的复杂化。

总而言之,库是为像您这样的用例而设计的,因此它们比通过面向人类的命令组装您自己的界面更好地工作也就不足为奇了,特别是对于边缘情况(尽管这样的手动合成是非常有用的可能!)。如果安装像 paramiko 这样的非标准依赖项是一种负担,至少直接使用 subprocess ;去掉第二个外壳已经是很大的进步了。

关于python - 文件相关操作 python 子进程 vs 原生 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58426347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com