我有一个我最近编写的Python脚本,我使用命令行调用了一些选项.我现在想要一个非常瘦的Web界面来在我的Mac上本地调用此脚本.
我不想经历在我的Mac上安装mod_python或mod_wsgi的小麻烦,所以我只是从PHP做一个system()或popen()来调用Python脚本.
有更好的想法吗?提前致谢!
根据您的工作,system()或popen()可能是完美的.如果Python脚本没有输出,或者您希望Python脚本的输出直接进入浏览器,请使用system().如果要将数据写入Python脚本的标准输入,或者从Python脚本的标准输出中读取数据,请使用popen().popen()只会让你读或写,但不能同时读和写.如果你想要两者,请查看proc_open(),但是在程序之间进行双向通信时,需要注意避免死锁,每个程序都在等待另一个程序执行某些操作.
如果要将用户提供的数据传递给Python脚本,那么最重要的是注入命令.如果您不小心,您的用户可能会向您发送"; evilcommand;"等数据 并使你的程序违背你的意愿执行任意命令.
escapeshellarg()和escapeshellcmd()可以帮助解决这个问题,但我个人希望删除所有不是已知好角色的东西,使用像
preg_replace('/[^a-zA-Z0-9]/', '', $str)
反引号运算符还允许您使用与上面类似的语法运行python脚本
在一个名为python.py的python文件中:
hello = "hello" world = "world" print hello + " " + world
在一个名为python.php的php文件中:
$python = `python python.py`; echo $python;
还有一个PHP扩展:Pip - PHP中的Python,我从来没有尝试过但只是为这样的场合添加了书签
你可以通过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脚本并在浏览器上显示输出
我总是为快速和脏的脚本做这种事情.拥有一个只使用system/popen来调用某些外部程序的CGI或PHP脚本是很常见的.
如果您的网络服务器对整个互联网开放,请格外小心.在这种情况下,请务必清理GET/POST输入,以免攻击者在您的计算机上运行任意命令.