0

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

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

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

有任何想法吗?

4

2 回答 2

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 代码启动该服务并作为客户端发出请求。
于 2014-10-20T19:04:21.817 回答
0

这就是我所做的。

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);

?>

蟒蛇部分:

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.

奇迹般有效。

于 2014-10-20T20:04:37.387 回答