从PHP运行Python脚本

时间:2013-11-01 20:54:21

标签: php python linux exec archlinux

我正在尝试使用以下命令从PHP运行Python脚本:

exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');

但是,PHP根本不会产生任何输出。错误报告设置为E_ALL并且display_errors已启用。

这是我尝试过的:

  • 我使用python2/usr/bin/python2python2.7代替/usr/bin/python2.7
  • 我还使用了相对路径而不是绝对路径,它也没有改变任何东西。
  • 我尝试使用命令execshell_execsystem

但是,如果我跑

if (exec('echo TEST') == 'TEST')
{
    echo 'exec works!';
}

它完全正常,而shutdown now没有做任何事情。

PHP具有访问和执行文件的权限。

编辑:感谢亚历杭德罗,我能够解决问题。如果您遇到同样的问题,请不要忘记您的网络服务器可能/希望不会以root用户身份运行。 尝试以网络服务器的用户或具有类似权限的用户身份登录,并尝试自行运行命令。

10 个答案:

答案 0 :(得分:131)

在Ubuntu Server 10.04上测试。我希望它对Arch Linux也有帮助。

在PHP use shell_exec function中:

  

通过shell执行命令并将完整输出作为字符串返回。

     

它返回执行命令的输出,如果是错误则返回NULL   发生或命令没有输出。

<?php 

$command = escapeshellcmd('/usr/custom/test.py');
$output = shell_exec($command);
echo $output;

?>

在Python文件test.py中,请在第一行验证此文字:(see shebang explain)

#!/usr/bin/env python

Python文件must have correct privileges(如果PHP脚本在浏览器或卷曲中运行,则执行用户www-data / apache) 和/或必须是“可执行的”。此外,.py文件中的所有命令都必须具有正确的权限:

采取from php manual

  

快速提醒那些尝试在shell上使用shell_exec的人   unix型平台似乎无法让它工作。 PHP执行为   系统上的Web用户(通常是Apache的www),所以你需要   确保Web用户拥有任何文件或权限   您尝试在shell_exec命令中使用的目录。   另外,它似乎没有做任何事情。

make executable a file on unix-type platforms

chmod +x myscript.py

答案 1 :(得分:20)

我建议使用passthru并直接处理输出缓冲区:

ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean(); 

答案 2 :(得分:13)

如果您想知道命令的返回状态并获得整个stdout输出,可以实际使用exec

$command = 'ls';
exec($command, $out, $status);

$out是所有行的数组。 $status是返回状态。对调试非常有用。

如果您还希望看到stderr输出,则可以使用proc_open或只是将2>&1添加到$command。后者通常足以让事情变得更加“快速”以实现“实施”。

答案 3 :(得分:9)

亚历杭德罗钉了它,添加了对异常的澄清(Ubuntu或Debian) - 我没有代表添加答案本身:

sudoers文件: sudo visudo

例外情况: www-data ALL=(ALL) NOPASSWD: ALL

答案 4 :(得分:3)

在我的情况下,我需要在名为www的{​​{1}}目录中创建一个新文件夹。在scripts内,我添加了一个名为scripts的新文件。

然后我使用了test.pysudo chown www-data:root scripts

然后我转到了新的sudo chown www-data:root test.py目录并使用了scripts

我的test.py文件看起来像这样。请注意不同的Python版本:

sudo chmod +x test.py

从php我现在这样做:

#!/usr/bin/env python3.5
print("Hello World!")

你应该看到:Hello World!

答案 5 :(得分:3)

根据情况明确使用哪个命令

exec()-执行外部程序

system()-执行外部程序并显示输出

passthru()-执行外部程序并显示原始输出

来源:http://php.net/manual/en/function.exec.php

答案 6 :(得分:2)

上述方法似乎很复杂。用我的方法作为参考。

我有这两个文件:

  • run.php

  • mkdir.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");

答案 7 :(得分:1)

这是微不足道的,但只是想帮助那些已经遵循亚历杭德罗的建议但遇到这个错误的人:

  

sh:blabla.py:找不到命令

如果有人遇到这个错误,那么Alejandro需要对php文件做一点改动:

$command = escapeshellcmd('python blabla.py');

答案 8 :(得分:1)

受亚历杭德罗·奎罗兹(Alejandro Quiroz)的启发:

<?php 

$command = escapeshellcmd('python test.py');
$output = shell_exec($command);
echo $output;

?>

需要添加Python,不需要路径。

答案 9 :(得分:0)

以上所有选项都会创建新的系统进程。这是一场表演梦night。 为此,我将PHP模块与对Python的“透明”调用结合在一起了。

https://github.com/kirmorozov/runpy

编译可能很棘手,但是可以节省系统进程,并使您可以在两次PHP调用之间保持Python运行时。