【问题标题】:Calling Python in PHP在 PHP 中调用 Python
【发布时间】:2008-10-03 13:44:41
【问题描述】:

我最近编写了一个 Python 脚本,我使用带有一些选项的命令行调用它。我现在想要一个非常薄的 Web 界面来在我的 Mac 上本地调用这个脚本。

我不想经历在我的 Mac 上安装 mod_python 或 mod_wsgi 的小麻烦,所以我只想从 PHP 中执行 system() 或 popen() 来调用 Python 脚本。

有更好的想法吗?提前致谢!

【问题讨论】:

    标签: php python


    【解决方案1】:

    根据您的操作,system()popen() 可能是完美的。如果 Python 脚本没有输出,或者您希望 Python 脚本的输出直接进入浏览器,请使用 system()。如果要将数据写入 Python 脚本的标准输入,或者从 php.ini 中的 Python 脚本的标准输出读取数据,请使用 popen()。 popen() 只会让你读或写,但不能两者兼而有之。如果两者都需要,请查看proc_open(),但对于程序之间的双向通信,您需要小心避免死锁,即每个程序都在等待另一个程序执行某项操作。

    如果您想将用户提供的数据传递给 Python 脚本,那么需要注意的最重要的事情就是命令注入。如果您不小心,您的用户可能会向您发送数据,例如“; evilcommand ;”并让你的程序违背你的意愿执行任意命令。

    escapeshellarg()escapeshellcmd() 可以帮助解决这个问题,但我个人喜欢删除所有不是已知好角色的东西,使用类似

    preg_replace('/[^a-zA-Z0-9]/', '', $str)
    

    【讨论】:

    • 子进程模块已直接使用 os.Popen[n] 替换。你应该改用它。
    • @Nick Stinemates:我们在谈论 PHP 函数 ;)
    • 是否没有不涉及 shell 的解决方案,例如 C 的 execve(),只是它在单独的进程上运行,而不必先 fork()。
    • 有并且一直有解决方案,但你必须在某个地方运行 python 才能从中得到一些东西。你可以制作简单的 python 服务,它只等待输入直到它有一些输入,或者你可以以某种方式触发你的程序(例如 linux inotify),然后是那些 PHP 扩展,然后是 linux 服务器的本地套接字。 PHP 中的 Python 看起来是最好的 NoShell 解决方案,因为其他(非插件)总是在你的 python 周围有某种 shell。
    【解决方案2】:

    反引号运算符还允许您使用与上述类似的语法运行 python 脚本

    在名为 python.py 的 python 文件中:

    hello = "hello"
    world = "world"
    print hello + " " + world
    

    在一个名为 python.php 的 php 文件中:

    $python = `python python.py`;
    echo $python;
    

    【讨论】:

      【解决方案3】:

      您可以通过php运行python脚本,并在浏览器上输出。

      基本上你必须这样调用python脚本:

      $command = "python /path/to/python_script.py 2>&1";
      $pid = popen( $command,"r");
      while( !feof( $pid ) )
      {
       echo fread($pid, 256);
       flush();
       ob_flush();
       usleep(100000);
      }
      pclose($pid);
      

      注意:如果你在 python 代码中运行任何 time.sleep(),它不会在浏览器上输出结果。

      如需完整代码,请访问How to execute python script from php and show output on browser

      【讨论】:

      • 这里如何指定相对路径和绝对路径。基本上我的 python 脚本存在于假设文件夹tempmon 下,并且同一个文件夹包含我的 python 脚本。我希望应用程序是可移植的,因此只需复制htdocs 下的tempmon 文件夹即可。同样应该适用于不同的机器。
      • 完美运行。您可以添加打开和关闭 php 标签 以便初学者更好地理解
      【解决方案4】:

      我一直在为快速而肮脏的脚本做这种事情。使用 system/popen 调用外部程序的 CGI 或 PHP 脚本是很常见的。

      如果您的网络服务器对整个互联网开放,请格外小心。在这种情况下,请务必清理您的 GET/POST 输入,以免攻击者在您的计算机上运行任意命令。

      【讨论】:

        【解决方案5】:

        您的 call_python_file.php 应该如下所示:

        <?php
            $item='Everything is awesome!!';
            $tmp = exec("py.py $item");
            echo $tmp;
        ?>
        

        这会执行 python 脚本并将结果输出到浏览器。 在您的 python 脚本中, (sys.argv[1:]) 变量将引入您的所有参数。要将 argv 显示为您的 php 从何处提取的字符串,因此如果您想做一个文本区域:

        import sys
        
        list1 = ' '.join(sys.argv[1:])
        
        def main():
          print list1
        
        if __name__ == '__main__':
            main()
        

        【讨论】:

          【解决方案6】:

          上述方法似乎很复杂。参考我的方法。

          我有这两个文件

          运行.php

          mkdir.py

          在这里,我创建了一个包含 GO 按钮的 html 页面。每当您按下此按钮时,将在您提到的路径的目录中创建一个新文件夹。

          运行.php

          <html>
           <body>
            <head>
             <title>
               run
             </title>
            </head>
          
             <form method="post">
          
              <input type="submit" value="GO" name="GO">
             </form>
           </body>
          </html>
          
          <?php
              if(isset($_POST['GO']))
              {
                  shell_exec("python /var/www/html/lab/mkdir.py");
                  echo"success";
              }
          ?>
          

          mkdir.py

          #!/usr/bin/env python    
          import os    
          os.makedirs("thisfolder");
          

          【讨论】:

            【解决方案7】:

            请注意,如果您使用的是虚拟环境(如在共享主机中),那么您必须调整到 python 的路径,例如:/home/user/mypython/bin/python ./cgi-bin/test.py

            【讨论】:

              【解决方案8】:

              就是这么简单? 您可以使用 [phpy - php 库][1] php文件

              <?php
                require_once "vendor/autoload.php";
              
                use app\core\App;
              
                $app = new App();
                $python = $app->python;
                $output = $python->set(your python path)->send(data..)->gen();
                var_dump($ouput);
              

              python 文件:

              import include.library.phpy as phpy
              print(phpy.get_data(number of data , first = 1 , two =2 ...))
              

              您还可以在 github 页面中查看示例 [1]:https://github.com/Raeen123/phpy

              【讨论】:

                【解决方案9】:

                如果您想在 PHP 中执行 Python 脚本,则需要在您的 php 脚本中执行此命令:

                exec('your script python.py')
                

                【讨论】:

                • a) 用空格分隔参数,即这会尝试使用参数scriptpython.py 调用程序your。 b) 除非 Python 脚本有适当的 shebang,否则必须调用 Python 解释器并将脚本名称传递给它 (python script.py)。即使使用适当的 shebang,这也是错误的,因为您会调用 ./script.py 而不是使用解释器名称。
                猜你喜欢
                • 2014-09-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-12-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多