在PHP中调用Python

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

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

任何更好的想法? 提前致谢!

根据你在做什么, system()或popen()可能是完美的。 如果Python脚本没有输出,或者如果您希望Python脚本的输出直接到浏览器,请使用system()。 如果要将数据写入Python脚本的标准input,或者使用php中的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脚本并在浏览器上显示输出

我一直在做这种事情,以便快速和肮脏的脚本。 有一个CGI或PHP脚本,只是使用系统/ popen来调用一些外部程序是很常见的。

如果您的networking服务器向互联网开放,请特别小心。 在这种情况下,请确保清理GET / POSTinput,以免攻击者在您的机器上运行任意命令。

你的call_python_file.php应该是这样的:

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

这将执行python脚本并将结果输出到浏览器。 而在你的python脚本中,(sys.argv [1:])variables将带入你所有的参数。 要显示argv作为一个string,无论你的php从哪里如果你想要做一个文本区域:

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

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

如果你想在PHP中执行你的Python脚本,就必须在你的php脚本中执行这个命令:

 exec('your script python.py')