【问题标题】:Send Parameter to a Python Script Running at Background From PHP从 PHP 向后台运行的 Python 脚本发送参数
【发布时间】:2014-10-20 18:53:21
【问题描述】:

我有一个 python 脚本 (analyze.py),它将文件名作为参数并对其进行分析。完成分析后,它会等待另一个文件名。我想做的是:

  1. 将文件名作为参数从 PHP 发送到 Python。
  2. 使用来自 PHP 的文件名在后台运行 analyze.py 作为守护进程。

我可以将 PHP 中的参数作为命令行参数发布到 Python,但我无法将参数发送到已经在后台运行的 Python 脚本。

有什么想法吗?

【问题讨论】:

  • 您是否有理由不能为每个文件名重新启动 Python 脚本?有时对此有很好的答案(例如,Windows 上的进程启动开销可能是几分之一秒,如果每个文件只需要 20 毫秒来处理,则为每个文件使用单独的进程将是愚蠢的),但如果你不没有一个,为什么不保持简单呢? (也为并行处理等打开了大门)
  • 我无法重新启动该流程,因为其中包含一些培训内容。训练后进入分析过程。必须在 python 脚本开始运行时进行训练。

标签: php python python-2.7 background-process python-daemon


【解决方案1】:

这里的明显答案是:

  1. 每个文件名运行一次analyze.py,而不是将其作为守护进程运行。
  2. 在启动时传递 analyze.py 一大堆文件名,而不是一次传递一个。

但是,对于您的情况,这两种显而易见的答案都不起作用,这可能是有原因的。如果是这样,那么您需要某种形式的进程间通信。有几种选择:

  • 通过从 (PHP) 父进程写入数据,使用 Python 脚本的标准输入向其传递数据。 (我不知道如何从 PHP 中做到这一点,或者即使有可能,但 Python、sh 和许多其他语言非常简单,所以……)
  • 打开 TCP 套接字、Unix 套接字、命名管道、匿名管道等,将一端交给 Python 子进程,将另一端保留在 PHP 父进程中。 (请注意,第一个实际上只是这个的一个特例——在幕后,标准输入基本上只是子级和父级之间的匿名管道。)
  • 打开共享内存区域,或mmap-ed 文件,或类似的父子文件。这可能还需要共享一个信号量,您可以使用该信号量来构建条件或事件,以便孩子可以通过某种方式等待下一个输入。
  • 使用一些更高级别的 API 来封装上述内容之一——例如,将 Python 子项编写为一个简单的 HTTP 服务(或 JSON-RPC 或 ZeroMQ 或几乎任何你能在这两种语言中找到好的库的东西);让 PHP 代码启动该服务并作为客户端发出请求。

【讨论】:

  • 这太棒了。太感谢了。我使用 JSON-RPC 将我的 python 脚本编写为 HTTP 服务。它就像一个魅力:)
  • @AsımSinanYüksel:嗯,这很快。 :) 令人惊讶的是,现在做高级解决方案是多么容易。
【解决方案2】:

这就是我所做的。

PHP部分:

<?php

$param1 = "filename";

$command = "python analyze.py ";
$command .= " $param1";

$pid = popen( $command,"r");
 echo "<body><pre>";
while( !feof( $pid ) )
{
 echo fread($pid, 256);
 flush();
 ob_flush();
}
pclose($pid);

?>

Python部分:

1. I used [JSON-RPC]: https://github.com/gerold-penz/python-jsonrpc to
create a http service that wraps my python script (runs forever)
2. Created a http client that calls the method of http service.
3. Printed the results in json format.

像魅力一样工作。

【讨论】:

  • 您应该能够将 JSON-RPC/HTTP 客户端直接嵌入到您的 PHP 中,而不是将其作为单独的服务编写……但是如果这可行,并且您可以毫无问题地编写它半个小时,难与成功争辩。 :)
猜你喜欢
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
相关资源
最近更新 更多