我已经在我的覆盆子pi上使用PHP
网络服务器暂时使用Apache2
了一段时间。它很有效,但我厌倦了总是不得不思考" how do I X in
PHP "
或" what was the function name for this in PHP
"。
我的印象非常强烈,我应该使用<?php ?>
代码替换python
代码,但我的搜索结果充其量只是令人困惑。
我本质上是在寻找能够在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
进行了尝试;但这并不是理想的逃避所有的&#39;和&#34;字符...
答案 0 :(得分:-2)
<?php
function py($s){
exec("python -c '$s'",$arr);
foreach($arr as $v){
echo $v."\n";}
}
?>
然后我使用php Heredoc
(相当于python&#34;&#34;&#34;,意味着我不必逃避每一个双引号)来填充函数:< / p>
<?php
py(<<<python
print "Hello world<br>"
s="ello world"
for x in s:
print x+"<br>"
python
);
?>
输出&gt;&gt;&gt;
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 webserver(我也做过)。