【发布时间】:2008-10-03 13:44:41
【问题描述】:
我最近编写了一个 Python 脚本,我使用带有一些选项的命令行调用它。我现在想要一个非常薄的 Web 界面来在我的 Mac 上本地调用这个脚本。
我不想经历在我的 Mac 上安装 mod_python 或 mod_wsgi 的小麻烦,所以我只想从 PHP 中执行 system() 或 popen() 来调用 Python 脚本。
有更好的想法吗?提前致谢!
【问题讨论】:
我最近编写了一个 Python 脚本,我使用带有一些选项的命令行调用它。我现在想要一个非常薄的 Web 界面来在我的 Mac 上本地调用这个脚本。
我不想经历在我的 Mac 上安装 mod_python 或 mod_wsgi 的小麻烦,所以我只想从 PHP 中执行 system() 或 popen() 来调用 Python 脚本。
有更好的想法吗?提前致谢!
【问题讨论】:
根据您的操作,system() 或 popen() 可能是完美的。如果 Python 脚本没有输出,或者您希望 Python 脚本的输出直接进入浏览器,请使用 system()。如果要将数据写入 Python 脚本的标准输入,或者从 php.ini 中的 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运行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
【讨论】:
tempmon 下,并且同一个文件夹包含我的 python 脚本。我希望应用程序是可移植的,因此只需复制htdocs 下的tempmon 文件夹即可。同样应该适用于不同的机器。
我一直在为快速而肮脏的脚本做这种事情。使用 system/popen 调用外部程序的 CGI 或 PHP 脚本是很常见的。
如果您的网络服务器对整个互联网开放,请格外小心。在这种情况下,请务必清理您的 GET/POST 输入,以免攻击者在您的计算机上运行任意命令。
【讨论】:
您的 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");
【讨论】:
请注意,如果您使用的是虚拟环境(如在共享主机中),那么您必须调整到 python 的路径,例如:/home/user/mypython/bin/python ./cgi-bin/test.py
【讨论】:
就是这么简单? 您可以使用 [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
【讨论】:
如果您想在 PHP 中执行 Python 脚本,则需要在您的 php 脚本中执行此命令:
exec('your script python.py')
【讨论】:
script 和python.py 调用程序your。 b) 除非 Python 脚本有适当的 shebang,否则必须调用 Python 解释器并将脚本名称传递给它 (python script.py)。即使使用适当的 shebang,这也是错误的,因为您会调用 ./script.py 而不是使用解释器名称。