我正在尝试使用以下命令从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。如果我运行

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


它可以正常工作,而/usr/bin/python2.7却不执行任何操作。 。

编辑:感谢Alejandro,我得以解决此问题。如果您遇到相同的问题,请不要忘记您的网络服务器可能/希望不是以root用户身份运行。尝试以Web服务器的用户或具有类似权限的用户身份登录,然后尝试自己运行命令。

评论

第一次访问此问题stackoverflow.com/questions/21659637/…如果不固定,并且遇到诸如万一您被导入卡住或tty或没有AskPass不起作用的问题,请检查此链接以获取执行它的详细步骤。 stackoverflow.com/a/57978771/9470457谢谢!!!

#1 楼

在Ubuntu Server 10.04上测试。我希望它也可以在Arch Linux上为您提供帮助。

在PHP中使用shell_exec函数:


通过shell执行命令并以字符串形式返回完整的输出。 br />
它返回已执行命令的输出,如果发生错误
或命令不产生任何输出,则返回NULL。


<?php 

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

?>


在Python文件test.py中,请在第一行中验证以下文本:(请参见shebang解释): -data / apache(如果PHP脚本在浏览器或curl中运行)
和/或必须是“可执行的”。同样,进入.py文件的所有命令都必须具有正确的特权:

取自php手册:


对于那些试图在
上使用shell_exec的人来说,这只是一个简短的提醒。 unix型平台,似乎无法使其正常工作。 PHP以系统上的Web用户(通常是www,对于Apache)执行,因此您需要
确保Web用户对您要尝试访问的任何文件或目录具有权限在shell_exec命令中使用。
否则,它似乎没有任何作用。


在Unix类型平台上将可执行文件制作为文件:

#!/usr/bin/env python


评论


谢谢,成功了!还有一个问题-Apache用户无法在Python脚本中执行命令,但是我能够通过使用sudo并将脚本的异常添加到sudoers文件中来解决此问题。再次感谢! :)

–废弃的帐户
13年3月3日,11:40

我正面临着Apache用户的同样问题,能否请您指导我?

–艾玛
15年7月29日在9:11



我用你的答案,它可以很好地执行python脚本,但是我无法回显结果,网页上什么也没有出现,您能帮我吗。

– Hamdi Charef
16年8月18日在13:37

第一行上的“#!/ usr / bin / env python”对我有用。大!

– C3PO
18年1月27日在12:34

对于OSX:echo shell_exec(“ / usr / local / bin / python3 /Users/cyborg/Dev/magic.py”);或:echo shell_exec(“ / usr / bin / python /Users/cyborg/Dev/magic.py”);

–Cyborg
4月10日8:10

#2 楼

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

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


#3 楼

如果要了解命令的返回状态并获取整个stdout输出,则可以实际使用exec

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


$out是所有行的数组。 $status是返回状态。对于调试非常有用。后者通常足以使工作正常运行并更快地实现。

#4 楼

亚历杭德罗(Alejandro)钉上了钉子,为异常(Ubuntu或Debian)添加了说明-我没有代表要添加到答案本身: br />添加了例外:
sudo visudo

评论


向www.data添加到sudoers似乎并不有效,并且给apache更多所需的权限。对正在执行的脚本授予www-data权限就足够了。

–JasonRDalton
2014年7月31日在18:59

很酷的主意,但肯定会使您的系统容易受到攻击。我同意@JasonRDalton

–芦苇
2月26日21:09

#5 楼

根据情况确定要使用的命令

exec()-执行外部程序

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

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

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

#6 楼

就我而言,我需要在www目录中创建一个名为scripts的新文件夹。在scripts中,我添加了一个名为test.py的新文件。

然后我使用了sudo chown www-data:root scriptssudo chown www-data:root test.py

然后我进入了新的scripts目录,并使用了sudo chmod +x test.py。像这样。请注意不同的Python版本:

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


从php我现在要这样做:

$message = exec("/var/www/scripts/test.py 2>&1");
print_r($message);


,您应该请参阅:世界您好!

#7 楼

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

我有以下两个文件:


run.php
mkdir.py

在这里,我创建了一个包含GO按钮的HTML页面。每当您按下此按钮时,都会在您提到的路径目录中创建一个新文件夹。

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");


#8 楼

这很琐碎,但只是想帮助已经遵循Alejandro的建议但遇到此错误的任何人: >
如果有人遇到该错误,则Alejandro需对php文件进行一些更改:

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


#9 楼

受Alejandro Quiroz的启发:
<?php 

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

?>

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

评论


这为我在共享主机上工作。

– Vishal Kumar Sahu
11月29日17:19

#10 楼

以上所有选项都会创建新的系统进程。这是一场性能梦night。
为此,我将PHP模块与对Python的“透明”调用结合在一起。
https://github.com/kirmorozov/runpy
进行编译,但可以节省系统进程,并使您可以在两次PHP调用之间保持Python运行时。