Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.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 - Fatal编程技术网

在PHP中调用Python

在PHP中调用Python,php,python,Php,Python,我最近编写了一个Python脚本,我使用带有一些选项的命令行调用它。我现在想要一个非常薄的web界面在我的Mac上本地调用这个脚本 我不想经历在我的Mac上安装mod_python或mod_wsgi的小麻烦,所以我只想从PHP中执行一个system()或popen()来调用python脚本 还有更好的主意吗?提前谢谢 取决于你在做什么,或者可能是完美的。如果Python脚本没有输出,或者希望Python脚本的输出直接进入浏览器,请使用system()。如果要将数据写入Python脚本的标准输入,

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

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


还有更好的主意吗?提前谢谢

取决于你在做什么,或者可能是完美的。如果Python脚本没有输出,或者希望Python脚本的输出直接进入浏览器,请使用system()。如果要将数据写入Python脚本的标准输入,或从php中Python脚本的标准输出读取数据,请使用popen()。popen()只允许您读或写,但不能同时读或写。如果两个程序都需要,请检查,但是对于程序之间的双向通信,您需要小心避免死锁,因为每个程序都在等待另一个程序执行某些操作

如果希望将用户提供的数据传递给Python脚本,那么需要注意的一件大事是命令注入。如果您不小心,您的用户可能会向您发送“evilcommand”之类的数据,并使您的程序违背您的意愿执行任意命令

可以帮上忙,但就我个人而言,我喜欢用类似于

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

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


如果您的web服务器对internet开放,请格外小心。在这种情况下,请确保对GET/POST输入进行清理,以免攻击者在您的计算机上运行任意命令。

还有一个PHP扩展:,我从未尝试过它,但在这种情况下将其标记为书签。

您可以通过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(),它将不会在浏览器上输出结果


要使用完整的代码,请访问

backquote操作符还将允许您使用与上述类似的语法运行python脚本

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

hello = "hello"
world = "world"
print hello + " " + world
在名为python.php的php文件中:

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

如果要在PHP中执行Python脚本,必须在PHP脚本中执行以下命令:

exec('your script python.py')

您的调用_python_file.php应该如下所示:

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

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

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

我有这两个文件

run.php

mkdir.py

在这里,我创建了一个包含GO按钮的html页面。无论何时按下此按钮,都会在您提到的目录中创建一个新文件夹

run.php


子流程模块已经直接使用os.Popen[n]替换,这非常简单。您应该改为使用它。@Nick:我们讨论的是PHP函数;)除了在一个单独的进程上运行而不必首先使用fork()之外,没有任何解决方案不涉及shell,比如C的execve()。有,而且总是有解决方案的,但是您必须在某个地方运行python才能从中获得一些东西。您可以创建一个简单的python服务,它只等待输入,直到它有一些输入,或者您可以以某种方式触发您的程序(例如LinuxInotify),然后是PHP扩展,然后是linux服务器的本地套接字。PHP中的Python看起来像是最好的NoShell解决方案,因为其他(非插件)在您的Python周围总是有某种外壳。请注意,“pip”这个名称也用于描述非常流行和相当标准的Python包管理工具,因此对于这个PHP工具来说,这是一个非常糟糕、令人困惑和注定要失败的名称。也许这就是为什么它这么长时间没有更新的原因。看起来它仍然在使用(sans糟糕的名称选择)如何在这里指定相对和绝对路径。基本上,我的python脚本位于文件夹
tempmon
下,同一文件夹包含我的python脚本。我希望应用程序是可移植的,这样就可以复制
htdocs
下的
tempmon
文件夹。同样的方法可以在不同的机器上使用,非常好用。您可以添加开始和结束php标记,以便初学者更好地理解a)空格单独的参数,也就是说,这尝试使用参数
script
python.py
调用程序
your
。b) 除非Python脚本具有正确的shebang,否则必须调用Python解释器并将脚本名称传递给它(
Python script.py
)。即使使用正确的shebang,这也是错误的,因为您将调用
/script.py
,而不是使用解释器名称。
import sys

list1 = ' '.join(sys.argv[1:])

def main():
  print list1

if __name__ == '__main__':
    main()
<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";
    }
?>
#!/usr/bin/env python    
import os    
os.makedirs("thisfolder");