在PHP中调用Python
我最近写了一个Python脚本,通常是通过命令行加上一些选项来运行它。现在我想在我的Mac上做一个简单的网页界面,方便调用这个脚本。
我不想在Mac上安装mod_python或mod_wsgi这些东西,觉得有点麻烦,所以我打算直接用PHP里的system()或popen()来调用这个Python脚本。
有没有更好的办法呢?
10 个回答
你可以通过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(),那么结果就不会在浏览器上显示出来。
想要查看完整的代码示例,可以访问 如何通过PHP执行Python脚本并在浏览器上显示输出
shell_exec()这个操作符也可以让你用跟上面类似的语法来运行Python脚本。
在一个叫做python.py的Python文件里:
hello = "hello"
world = "world"
print hello + " " + world
在一个叫做python.php的PHP文件里:
$python = shell_exec(python python.py);
echo $python;
根据你要做的事情,system() 或者 popen() 可能是很合适的选择。如果你的 Python 脚本没有输出,或者你想让 Python 脚本的输出直接显示在浏览器上,就用 system()。如果你想往 Python 脚本的标准输入写数据,或者从 Python 脚本的标准输出读取数据,就用 popen()。不过,popen() 只能让你选择读或者写,不能同时进行。如果你想要同时读写,可以看看 proc_open(),但在程序之间进行双向通信时要小心,避免出现死锁的情况,也就是每个程序都在等对方做事情。
如果你想把用户提供的数据传给 Python 脚本,那么最重要的是要注意命令注入的问题。如果不小心,用户可能会发送像 "; evilcommand ;" 这样的数据,让你的程序执行一些你不想执行的命令。
escapeshellarg() 和 escapeshellcmd() 可以帮助你解决这个问题,但我个人更喜欢去掉所有不认识的字符,使用一些类似于
preg_replace('/[^a-zA-Z0-9]/', '', $str)