Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从PHP向后台运行的Python脚本发送参数_Php_Python_Python 2.7_Background Process_Python Daemon - Fatal编程技术网

从PHP向后台运行的Python脚本发送参数

从PHP向后台运行的Python脚本发送参数,php,python,python-2.7,background-process,python-daemon,Php,Python,Python 2.7,Background Process,Python Daemon,我有一个python脚本(analyze.py),它将文件名作为参数并对其进行分析。完成分析后,它将等待另一个文件名。我想做的是: 将文件名作为参数从PHP发送到Python 在后台运行analyze.py作为守护进程,文件名来自PHP 我可以将PHP中的参数作为命令行参数发布到Python中,但无法将参数发送到已经在后台运行的Python脚本中 有什么想法吗?这里最明显的答案是: 对每个文件名运行一次analyze.py,而不是将其作为守护进程运行 在启动时传递analyze.py一整套文件名

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

  • 将文件名作为参数从PHP发送到Python
  • 在后台运行analyze.py作为守护进程,文件名来自PHP
  • 我可以将PHP中的参数作为命令行参数发布到Python中,但无法将参数发送到已经在后台运行的Python脚本中


    有什么想法吗?

    这里最明显的答案是:

  • 对每个文件名运行一次
    analyze.py
    ,而不是将其作为守护进程运行
  • 在启动时传递
    analyze.py
    一整套文件名,而不是一次只传递一个文件名
  • 但可能有一个原因,在你的情况下,这两个明显的答案都不起作用。如果是这样,那么您需要某种形式的进程间通信。有几种选择:

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

        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脚本?对此,有时有很好的答案(例如,Windows上的进程启动开销可能是一秒钟的一个重要部分,如果每个文件只需要20毫秒处理,那么为每个文件使用单独的进程将是愚蠢的),但是如果没有,为什么不保持简单呢?(同时也打开了并行处理的大门,等等)我不能重新启动这个过程,因为它有一些培训内容。经过培训后,它进入分析过程。培训必须在python脚本开始运行时完成。这太棒了。非常感谢你。我使用JSON-RPC作为HTTP服务编写了python脚本。它就像一个符咒:)@AsımSinanYüksel:嗯,那很快令人惊讶的是,现在做高级解决方案是多么容易。你应该能够将JSON-RPC/HTTP客户端直接嵌入到你的PHP中,而不是将其作为一个单独的服务来编写……但是,如果这样做有效,并且你能够在半个小时内毫无问题地编写它,那么很难对成功提出异议。:)
        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.