Python PHP equivalent



我已经在我的树莓派上使用PHP一段时间了,我的Apache2网络服务器。 它工作得很好,但我厌倦了总是不得不思考"我如何在 PHP 中进行 X"或"PHP 中的函数名称是什么"。

我有一个强烈的印象,即应该有一些等效的东西,我可以用python代码替换<?php ?>代码,但我的搜索结果充其量是令人困惑的。

我本质上正在寻找一些东西,我可以在 HTML 脚本中编写任何python代码,并在请求时对其进行解释和执行,并将其输出插入页面。

例如,要从python中的列表创建用户表。

<table><tr><td>User list</td></tr>
<?python
import json
library=json.load(open(some_json_file,'r')); 
for user in library:
print "<tr><td>"+user+"</td></tr>"
?>
</table>

我的印象是变色龙可以使用此处描述的代码块来做到这一点,(https://chameleon.readthedocs.io/en/latest/reference.html),但当我深入研究时,我得到的印象是它不像我认为的那样工作。 这是我从我看过的所有模板引擎以及 WSGI 中得到的印象

PHP的python替代品有很好的下降吗? 或者有没有办法将半复杂的 python 代码干净地包装到我的 php 中,而不涉及编写由 PHP 调用的额外 python 脚本? 我试过exec()python -c;但这并不理想,必须逃离所有的 ' 和 ' 字符......

更新

下面的代码工作得很好,但如果在脚本中多次运行,可能会变得非常慢(在树莓派上每次大约需要 0.4 秒)。 我用python编写了一个程序,该程序在后台运行并处理来自php的请求,运行速度提高了约15倍。 我现在在 github 上维护它。

原始答案

在搞砸之后,我能够想出一些最适合我正在做的事情的东西。 在我的php中,我创建了一个执行python脚本的函数。

<?php 
function py($s){
exec("python -c '$s'",$arr);
foreach($arr as $v){
echo $v."n";}
}
?>

然后我使用 phpHeredoc(相当于 python "",意味着我不必转义每个双引号)来填充函数:

<?php
py(<<<python
print "Hello world<br>"
s="ello world"
for x in s:
print x+"<br>"
python
);
?>

输出>>>

Hello world
e
l
l
o
w
o
r
l
d

在这一点上,我遇到的唯一真正的缺点是这种方法使我无法在Python脚本中的任何位置使用单引号......:(。 我会克服的。

编辑

我添加了一些调整,使其更加有用。 新功能如下:

<?php
function py($s,$return=false){
$s=str_replace("'","'''",$s);
$h=<<<head
def cleanup():
for x in globals().keys():
if not x.startswith("_"):
del globals()[x]
import dill
try:
dill.load_session("pyworking.pkl")
except:
pass
head;
$f=<<<foot
import dill
dill.dump_session("pyworking.pkl")
foot;
if ($return==false){
echo shell_exec("python -c '$h$s$f'");
}
else {
return shell_exec("python -c '$h$s$f'");
}
}
?>

这允许您在脚本中使用单引号,并在同一脚本中多次调用py()函数,您的变量和模块将跟随您。在脚本结束时,您只需调用清理(或使用 php 清除 pyworking.pkl 文件)并擦除环境。

我还把这个函数放在一个文件中,在我的pyp.ini我使用auto_prepend_file=my/file/location自动包含它,所以不需要事先加载它。

总的来说,我对这种方法非常满意,特别是因为我可以在我的 python 脚本中读取 php 变量。 传递对象非常简单,如下所示:

<?php
$data_en=json_encode($data);
py(<<<p
import json
data=$data_en
#do something with data
p
);
?>

如果我能想到一种在脚本中为 PHP 变量赋值的方法,那将是完美的,但如果你想要 PHP 和 Python 的融合,或者只是一种在不编写 Python 网络服务器的情况下用 Python 做所有事情的方法,这将不是一个糟糕的解决方法(我也做过)。

最新更新