【问题标题】:Python best practice : Whether to use subprocess/fabric calls or use a Linux script?Python 最佳实践:是使用子进程/结构调用还是使用 Linux 脚本?
【发布时间】:2015-06-22 07:45:11
【问题描述】:

我有一个用例,我需要在远程机器上运行 Linux 命令。目前,我正在使用织物来实现该功能。但是,我想知道使用 Shell 脚本而不是 Python 是否会更好。

我的用例是设置一些服务,在 MySQL 中设置 dbs,并另外创建一些脚本,然后在远程机器上执行这些脚本。目前,我在 Fabric 调用中嵌入了大约 50-60 行命令。
一切都必须在远程机器上执行,同样,我使用结构创建了与机器的连接,并使用 run/sudo 函数运行命令。对于所有不同的命令行,我使用单独的运行方法。

如果我必须使用 shell 脚本,我还有两种方法:

  1. 使用结构调用在远程计算机上运行脚本。
  2. 将脚本 ssh 放到另一台机器上,然后在那里运行。

实现该功能的最佳 Pythonic 方式是什么。

【问题讨论】:

  • 您的问题过于宽泛,无法以明确的方式回答。有很多事情要考虑,各有利弊。例如,您将尝试实现的算法的复杂性是多少?它是否需要任何/简单/复杂的远程到本地通信/同步?您多久调用一次,即 ssh 连接启动是否会浪费太多时间和 CPU 功率,或者您可以使用 SSH 主连接或 Fabric 提供的类似功能?最后但并非最不重要的一点是可维护性 - 什么更容易支持/调试 - 原始 shell 脚本或 python?..
  • @GreyCat 感谢您的回复。我已经编辑了我的问题,以添加一些回答问题所需的额外信息。但是,我无法理解您通过“简单/复杂的远程到本地通信/同步”对 ssh 通信的引用。请让我知道我应该添加哪些其他信息以使问题更具信息性。
  • “简单/复杂的通信”基本上是要点之一;)如果您的进程在本地和远程机器之间有很多通信,即您启动一些远程命令,获取输出,然后决定通过运行一些本地算法来执行下一个远程命令,这就是 Fabric 会发光的地方。另一方面,如果你只是在没有任何逻辑的情况下连续运行命令,这显然很容易将所有这些都包含在一个远程 shell 脚本中。无论如何,对于一个明确的答案的良好规范还有很长的路要走......
  • @GreyCat 感谢您的帮助。现在,我想我会继续使用 Fabric。

标签: python linux shell subprocess fabric


【解决方案1】:

您考虑过使用paramiko 吗?

这是 Brandon Rhodes 的“Python 网络编程基础”中的一个简单示例:

import paramiko

class AllowAnythingPolicy(paramiko.MissingHostKeyPolicy):
        def missing_host_key(self, client, hostname, key):
                return
client = paramiko.SSHClient()
client.set_missing_host_key_policy(AllowAnythingPolicy())
client.connect('127.0.0.1', username='username', password='python')

for command in 'echo "Hello, world!"', 'uname -a', 'uptime':
        stdin, stdout, stderr = client.exec_command(command)
        stdin.close()
        print repr(stdout.read())
        stdout.close()
        stderr.close()

client.close()

干杯,亚瑟

【讨论】:

  • 感谢您的回复,但我的问题是使用 Python 调用还是 Linux 脚本。
  • 啊好吧!我想两者都有优点和缺点。我发现这里提出了一些好的观点:Shell vs Python。我的观点是,既然你正在设置数据库,你不妨利用 python 库;您还可以包括更强大的错误处理。
  • 感谢您的链接伙伴!我现在继续使用 Python。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 2020-06-04
相关资源
最近更新 更多