在PHP中调用Python
我最近编写了一个Python脚本,我使用带有一些选项的命令行调用它。我现在想要一个非常薄的web界面在我的Mac上本地调用这个脚本 我不想经历在我的Mac上安装mod_python或mod_wsgi的小麻烦,所以我只想从PHP中执行一个system()或popen()来调用python脚本在PHP中调用Python,php,python,Php,Python,我最近编写了一个Python脚本,我使用带有一些选项的命令行调用它。我现在想要一个非常薄的web界面在我的Mac上本地调用这个脚本 我不想经历在我的Mac上安装mod_python或mod_wsgi的小麻烦,所以我只想从PHP中执行一个system()或popen()来调用python脚本 还有更好的主意吗?提前谢谢 取决于你在做什么,或者可能是完美的。如果Python脚本没有输出,或者希望Python脚本的输出直接进入浏览器,请使用system()。如果要将数据写入Python脚本的标准输入,
还有更好的主意吗?提前谢谢 取决于你在做什么,或者可能是完美的。如果Python脚本没有输出,或者希望Python脚本的输出直接进入浏览器,请使用system()。如果要将数据写入Python脚本的标准输入,或从php中Python脚本的标准输出读取数据,请使用popen()。popen()只允许您读或写,但不能同时读或写。如果两个程序都需要,请检查,但是对于程序之间的双向通信,您需要小心避免死锁,因为每个程序都在等待另一个程序执行某些操作 如果希望将用户提供的数据传递给Python脚本,那么需要注意的一件大事是命令注入。如果您不小心,您的用户可能会向您发送“evilcommand”之类的数据,并使您的程序违背您的意愿执行任意命令 可以帮上忙,但就我个人而言,我喜欢用类似于
preg_replace('/[^a-zA-Z0-9]/', '', $str)
我一直在做这种事情,为了快速而肮脏的脚本。有一个CGI或PHP脚本只使用system/popen调用一些外部程序是很常见的
如果您的web服务器对internet开放,请格外小心。在这种情况下,请确保对GET/POST输入进行清理,以免攻击者在您的计算机上运行任意命令。还有一个PHP扩展:,我从未尝试过它,但在这种情况下将其标记为书签。您可以通过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(),它将不会在浏览器上输出结果
要使用完整的代码,请访问backquote操作符还将允许您使用与上述类似的语法运行python脚本 在名为python.py的python文件中:
hello = "hello"
world = "world"
print hello + " " + world
在名为python.php的php文件中:
$python = `python python.py`;
echo $python;
如果要在PHP中执行Python脚本,必须在PHP脚本中执行以下命令:
exec('your script python.py')
您的调用_python_file.php应该如下所示:
<?php
$item='Everything is awesome!!';
$tmp = exec("py.py $item");
echo $tmp;
?>
请注意,如果您使用的是虚拟环境(如在共享主机中),则必须调整到python的路径,例如:
/home/user/mypython/bin/python./cgi-bin/test.py
上述方法似乎很复杂。用我的方法作为参考
我有这两个文件
run.php
mkdir.py
在这里,我创建了一个包含GO按钮的html页面。无论何时按下此按钮,都会在您提到的目录中创建一个新文件夹
run.php
子流程模块已经直接使用os.Popen[n]替换,这非常简单。您应该改为使用它。@Nick:我们讨论的是PHP函数;)除了在一个单独的进程上运行而不必首先使用fork()之外,没有任何解决方案不涉及shell,比如C的execve()。有,而且总是有解决方案的,但是您必须在某个地方运行python才能从中获得一些东西。您可以创建一个简单的python服务,它只等待输入,直到它有一些输入,或者您可以以某种方式触发您的程序(例如LinuxInotify),然后是PHP扩展,然后是linux服务器的本地套接字。PHP中的Python看起来像是最好的NoShell解决方案,因为其他(非插件)在您的Python周围总是有某种外壳。请注意,“pip”这个名称也用于描述非常流行和相当标准的Python包管理工具,因此对于这个PHP工具来说,这是一个非常糟糕、令人困惑和注定要失败的名称。也许这就是为什么它这么长时间没有更新的原因。看起来它仍然在使用(sans糟糕的名称选择)如何在这里指定相对和绝对路径。基本上,我的python脚本位于文件夹
tempmon
下,同一文件夹包含我的python脚本。我希望应用程序是可移植的,这样就可以复制htdocs
下的tempmon
文件夹。同样的方法可以在不同的机器上使用,非常好用。您可以添加开始和结束php标记,以便初学者更好地理解a)空格单独的参数,也就是说,这尝试使用参数script
和python.py
调用程序your
。b) 除非Python脚本具有正确的shebang,否则必须调用Python解释器并将脚本名称传递给它(Python script.py
)。即使使用正确的shebang,这也是错误的,因为您将调用/script.py
,而不是使用解释器名称。
import sys
list1 = ' '.join(sys.argv[1:])
def main():
print list1
if __name__ == '__main__':
main()
<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";
}
?>
#!/usr/bin/env python
import os
os.makedirs("thisfolder");