我有一个最近写的Python脚本,我使用命令行中的某些选项进行了调用。我现在想要一个非常薄的Web界面在Mac上本地调用此脚本。
我不想在Mac上安装mod_python或mod_wsgi时遇到麻烦,所以我只想从PHP执行system()或popen()来调用Python脚本。
还有更好的主意吗?提前致谢!
Answers:
根据您在做什么,system()或popen()可能是完美的。如果Python脚本没有输出,或者您希望Python脚本的输出直接进入浏览器,请使用system()。如果要向Python脚本的标准输入中写入数据,或从php中的Python脚本的标准输出中读取数据,请使用popen()。popen()仅允许您读取或写入,而不能两者都读取。如果两者都需要,请签出proc_open(),但是在程序之间进行双向通信时,需要小心避免死锁,因为每个程序都在等待对方做某事。
如果要将用户提供的数据传递给Python脚本,则要注意的主要事情是命令注入。如果您不小心,您的用户可以向您发送诸如“; evilcommand;”之类的数据。并让您的程序违反您的意愿执行任意命令。
escapeshellarg()和escapeshellcmd()可以帮助解决这个问题,但是我个人喜欢使用类似以下的方法删除所有不是好的字符
preg_replace('/[^a-zA-Z0-9]/', '', $str)
还有一个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脚本并在浏览器上显示输出
tempmon并且同一文件夹包含我的python脚本。我希望该应用程序具有可移植性,因此只需将其复制到tempmon下的文件夹即可htdocs。同样的应该在不同的机器上工作。
您的call_python_file.php应该如下所示:
<?php
$item='Everything is awesome!!';
$tmp = exec("py.py $item");
echo $tmp;
?>
这将执行python脚本,并将结果输出到浏览器。在您的python脚本中,(sys.argv [1:])变量将引入所有参数。要将argv显示为字符串,以表示您的php所处的位置,因此,如果要执行文本区域操作:
import sys
list1 = ' '.join(sys.argv[1:])
def main():
print list1
if __name__ == '__main__':
main()
上述方法似乎很复杂。使用我的方法作为参考。
我有这两个文件
运行.php
mkdir.py
在这里,我创建了一个包含GO按钮的html页面。每当您按下此按钮时,都会在您提到的路径中的目录中创建一个新文件夹。
运行.php
<html>
<body>
<head>
<title>
run
</title>
</head>
<form method="post">
<input type="submit" value="GO" name="GO">
</form>
</body>
</html>
<?php
if(isset($_POST['GO']))
{
shell_exec("python /var/www/html/lab/mkdir.py");
echo"success";
}
?>
mkdir.py
#!/usr/bin/env python
import os
os.makedirs("thisfolder");