【问题标题】:File related operations python subprocess vs. native python文件相关操作python子进程vs.原生python
【发布时间】:2019-10-17 06:41:12
【问题描述】:

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

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

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

stdout 重定向会忽略所有好的文件,然后读取 stderr 会给我一个所有未找到文件的列表。

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

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

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

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

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

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

【问题讨论】:

  • paramiko 是一个 SSH 库——这与形成在另一端运行的命令有什么关系?
  • 我问的是使用 paramiko 进行 ssh 连接与使用 subprocess.run('ssh ... ')

标签: python python-3.x bash subprocess


【解决方案1】:

这里实际上有三个选择:做某事in-process(如paramiko)、运行ssh 直接(使用subprocess)和运行ssh 带有 shell(也带有 subprocess)。作为一般规则,请避免以编程方式运行 shell(而不是根据交互式用户请求)。

原因是它是一个以人为本的界面(因此可以轻松地将单词与$HOME 和通配符的空格和快捷方式分开)作为 API 的功能大大不足。例如,考虑一下您的代码如何检测到缺少sshparamiko 不会出现这种情况(只要安装了 it),subprocess 很明显,并且只是一个(不明确的)exit code 和来自 shell 的 stderr 消息。还要考虑如何提供要运行的命令:它必须是适合 shell 的命令(由于 SSH 协议的限制),但如果你调用 ssh with shell,它必须是编码(有时称为“双重转义”),以使本地 shell 的解释成为远程 shell 所需的多字命令。

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

总之,库是为像您这样的用例而设计的,因此它们比从面向人类的命令组装您自己的界面(尽管这种手动组合是非常有用的可能!)。如果安装像paramiko 这样的非标准依赖是一种负担,至少直接使用subprocess;去掉第二个壳已经是很大的进步了。

【讨论】:

  • 1.不明白运行子进程和运行 shell 之间的区别(第二个和第三个选项)。他们都在使用子进程,不是吗? 2. 我明白你的观点,但很难接受它,因为它解释了 paramiko 如何适用于边缘情况。不过我很确定不会有。我知道我运行的机器。我之前安装了依赖项(作为安装和配置阶段的一部分),此外,如果由于缺少 ssh 而导致失败,整个应用程序会很快死掉,所以我不认为这是一个真正的问题.你能说服我吗?
  • @CIsForCookies:使用subprocess 而不使用shell=True 等效于shell 启动命令的操作。使用shell=True 可以启动命令/bin/sh 以便它可以解析您的字符串(希望您正确转义...)并执行相同的工作再次运行真正的命令(和错误地报告错误)。确实,当一切都按照您认为的方式运行时,差异很小,但是当然,事情会出现问题,这对于能够可靠地自动区分 ssh 的错误消息和 stat 是非常有帮助的s.
猜你喜欢
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
相关资源
最近更新 更多