【问题标题】:shell command from python script来自 python 脚本的 shell 命令
【发布时间】:2014-12-08 12:44:59
【问题描述】:

我需要你们 :D 我有一个网页,在这个页面上我检查了一些项目并将它们的值作为变量传递给 python 脚本。 问题是: 我需要编写一个 python 脚本,在该脚本中,我需要将此变量放入我预定义的 shell 命令中并运行它们。 它是一个 gnuplot 和另一个 shell 命令。

我从来没有在 python 中做过任何事情,你们能给我一些建议吗?

THx

【问题讨论】:

  • 不,我需要帮助整个脚本,不仅是这次调用。
  • @Cyber​​ 虽然这看起来像是在 Python 中使用子进程调用外部命令,但他的问题有一定的复杂性。他清楚地提到这是用于Web开发的。虽然在 python 中调用子进程很容易,但我们必须考虑 web 元素。有许多问题需要解决,而教程/提示还不够。这些问题可能包括权限、连接超时等。我认为与其立即驳回他的问题,不如为他的问题提供一些建议和澄清,

标签: python shell command


【解决方案1】:

由于缺少有关您使用的网络框架的信息,我无法完全解决您的问题,但这里有一些您会发现有用的建议和指导。我确实遇到了类似的问题,需要我运行一个 shell 程序来传递从用户请求派生的参数(我使用的是 django 框架(python))

现在你必须考虑几个因素

  1. 每项工作需要多长时间
  2. 您期望的负载是多少(会有很多工作负载)
  3. 你的shell命令会有副作用吗

这里有一些解释为什么这很重要

  1. 每项工作需要多长时间。

根据您的框架和浏览器,与服务器的连接保持活动的持续时间存在限制。换句话说,您必须考虑到服务器响应用户请求的时间不超过服务器或浏览器设置的连接超时时间。如果花费的时间太长,那么您将获得服务器连接超时。即你会得到一个错误响应,因为服务器端没有响应。

  1. 您期望的负载是多少。

您可能会想到,如果您请求的工作量很大,它会占用比您需要的更多的资源。此外,如果您同时有多个请求,则会对您的服务器造成巨大损失。例如,如果您确实继续为您的作业使用子流程,那么请务必注意您的作业是阻塞还是非阻塞。

  1. 副作用。

了解 shell 进程的副作用很重要。例如,如果您的 shell 进程涉及编写和生成大量临时文件,那么您将不得不考虑您的脚本所拥有的权限。这是一项复杂的任务。

那怎么解决呢!

subprocess随基本 python 一起提供将允许您使用 python 运行 shell 命令。如果您想要更复杂的工具,请查看 fabric 库。要传递参数,请查看 optparsesys.argv

如果您预计工作量很大或处理时间很长,请考虑为您的工作设置队列系统。像 celery 这样的流行框架就是一个很好的例子。您也可以查看 gevent 和 asyncio(python 3)。通常,您可以返回作业 ID 或 URL,而不是即时返回响应,以便用户稍后返回并查看

注意事项!

权限和安全至关重要!你最不想看到的就是让人们执行对你的系统有害的 shell 命令

您还可以根据您使用的框架增加连接超时。

我希望你会觉得这很有用

干杯, 生物鸟人

【讨论】:

  • 感谢您的回答;)我只需要完成简单的任务。我想这样做:人们将他们的数据文件上传到页面 - 获取此数据文件的文件名 - 脚本运行 gnuplot 并在网页上可视化数据......我还需要做一些简单的任务,但这对我来说很重要,所以谢谢寻求帮助;)
  • @mirko 然后一个简单的子流程调用将是您正在寻找的。请注意写/读权限