我最近写了一个Python脚本,我使用命令行和一些选项调用它。我现在想要一个非常薄的Web界面在我的Mac上本地调用这个脚本。我不想在Mac上安装mod_python或mod_wsgi时遇到一些小麻烦,所以我只想在PHP中执行system()或popen()来调用Python脚本。有更好的主意吗?
1szpjjfi1#
根据您的操作,system()或popen()可能是最佳选择。如果Python脚本没有输出,或者希望Python脚本的输出直接转到浏览器,则使用popen。()(如果要将数据写入Python脚本的标准输入,或从php. popen中Python脚本的标准输出读取数据()只会让你读或写,但不能两者都读。如果你想两者都读,请查看proc_open(),但对于程序之间的双向通信,你需要小心避免死锁,即每个程序都在等待另一个程序做一些事情。如果你想把用户提供的数据传递给Python脚本,那么最需要注意的就是命令注入,如果你不小心,你的用户可能会向你发送像“;坏命令;“并使您的程序违背您的意愿执行任意命令。escapeshellarg()和escapeshellcmd()可以帮助实现这一点,但我个人喜欢删除所有不是已知良好字符的内容,例如
preg_replace('/[^a-zA-Z0-9]/', '', $str)
b09cbbtk2#
shell_exec()操作符还允许您使用与上面类似的语法运行python脚本在一个名为www.example.com的python文件中python.py:
hello = "hello" world = "world" print hello + " " + world
在一个名为python.php的php文件中:
$python = shell_exec(python python.py); echo $python;
3htmauhk3#
你可以通过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(),它不会在浏览器上输出结果。有关完整代码的工作情况,请访问How to execute python script from php and show output on browser
eivnm1vs4#
我一直在为快速和肮脏的脚本做这类事情。CGI或PHP脚本只使用system/popen调用一些外部程序是很常见的。如果你的网络服务器对互联网是开放的,要格外小心。在这种情况下,一定要清理你的GET/POST输入,以免攻击者在你的机器上运行任意命令。
jtw3ybtb5#
你的call_python_file. php应该看起来像这样:
<?php $item='Everything is awesome!!'; $tmp = exec("py.py $item"); echo $tmp; ?>
这将执行python脚本并将结果输出到浏览器.在python脚本中,(sys.argv[1:])变量将带入所有参数.如果你想在文本区域中显示php从哪里拉取的argv:
import sys list1 = ' '.join(sys.argv[1:]) def main(): print list1 if __name__ == '__main__': main()
iyr7buue6#
上面的方法似乎比较复杂,请参考我的方法。我有两份文件run.phpmkdir.py在这里,我创建了一个html页面,其中包含GO按钮。每当你按下这个按钮,一个新的文件夹将在你提到的路径目录中创建。run.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");
62o28rlo7#
请注意,如果您使用的是虚拟环境(如在共享主机中),那么您必须调整您的python路径,例如:第一个月
ecr0jaav8#
你可以😁使用[phpy -php库][1] php文件
<?php require_once "vendor/autoload.php"; use app\core\App; $app = new App(); $python = $app->python; $output = $python->set(your python path)->send(data..)->gen(); var_dump($ouput);
python文件:
import include.library.phpy as phpy print(phpy.get_data(number of data , first = 1 , two =2 ...))
你也可以在github页面[1]中看到例子:https://github.com/Raeen123/phpy
vyswwuz29#
如果你想在PHP中执行Python脚本,有必要在php脚本中执行以下命令:
exec('your script python.py')
9条答案
按热度按时间1szpjjfi1#
根据您的操作,system()或popen()可能是最佳选择。如果Python脚本没有输出,或者希望Python脚本的输出直接转到浏览器,则使用popen。()(如果要将数据写入Python脚本的标准输入,或从php. popen中Python脚本的标准输出读取数据()只会让你读或写,但不能两者都读。如果你想两者都读,请查看proc_open(),但对于程序之间的双向通信,你需要小心避免死锁,即每个程序都在等待另一个程序做一些事情。
如果你想把用户提供的数据传递给Python脚本,那么最需要注意的就是命令注入,如果你不小心,你的用户可能会向你发送像“;坏命令;“并使您的程序违背您的意愿执行任意命令。
escapeshellarg()和escapeshellcmd()可以帮助实现这一点,但我个人喜欢删除所有不是已知良好字符的内容,例如
b09cbbtk2#
shell_exec()操作符还允许您使用与上面类似的语法运行python脚本
在一个名为www.example.com的python文件中python.py:
在一个名为python.php的php文件中:
3htmauhk3#
你可以通过php运行python脚本,并在浏览器上输出。
基本上你必须这样调用python脚本:
注意:如果你在你的python代码中运行任何time.sleep(),它不会在浏览器上输出结果。
有关完整代码的工作情况,请访问How to execute python script from php and show output on browser
eivnm1vs4#
我一直在为快速和肮脏的脚本做这类事情。CGI或PHP脚本只使用system/popen调用一些外部程序是很常见的。
如果你的网络服务器对互联网是开放的,要格外小心。在这种情况下,一定要清理你的GET/POST输入,以免攻击者在你的机器上运行任意命令。
jtw3ybtb5#
你的call_python_file. php应该看起来像这样:
这将执行python脚本并将结果输出到浏览器.在python脚本中,(sys.argv[1:])变量将带入所有参数.如果你想在文本区域中显示php从哪里拉取的argv:
iyr7buue6#
上面的方法似乎比较复杂,请参考我的方法。
我有两份文件
run.php
mkdir.py
在这里,我创建了一个html页面,其中包含GO按钮。每当你按下这个按钮,一个新的文件夹将在你提到的路径目录中创建。
run.php
mkdir.py
62o28rlo7#
请注意,如果您使用的是虚拟环境(如在共享主机中),那么您必须调整您的python路径,例如:第一个月
ecr0jaav8#
你可以😁使用[phpy -php库][1] php文件
python文件:
你也可以在github页面[1]中看到例子:https://github.com/Raeen123/phpy
vyswwuz29#
如果你想在PHP中执行Python脚本,有必要在php脚本中执行以下命令: