从PHP运行Python脚本

Aba*_*unt 103 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
  • 我还使用了相对路径而不是绝对路径,它也没有改变任何东西.
  • 我试着使用的命令exec,shell_exec,system.

但是,如果我跑

if (exec('echo TEST') == 'TEST')
{
    echo 'exec works!';
}
Run Code Online (Sandbox Code Playgroud)

它完美无缺,shutdown now而且什么都不做.

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

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

Ale*_*roz 141

在Ubuntu Server 10.04上测试.我希望它也可以帮助你在Arch Linux上.

在PHP中:

<?php 

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

?>
Run Code Online (Sandbox Code Playgroud)

在Python文件中test.py,在第一行验证此文本:( 请参阅shebang说明):

#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)

Python文件也应具有正确的权限(如果PHP脚本在浏览器中运行或通过curl执行,则执行用户www-data/apache)和/或必须是"可执行"..py文件中的所有命令也必须具有正确的权限.

chmod +x myscript.py
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这就是诀窍!还有一个问题 - Apache用户无法在Python脚本中执行命令,但我能够通过使用sudo并将我的脚本的异常添加到sudoers文件来解决这个问题.再次感谢!:) (6认同)
  • 对于 **OSX:** `echo shell_exec("/usr/local/bin/python3 /Users/cyborg/Dev/magic.py");` 或:`echo shell_exec("/usr/bin/python /Users/机器人/Dev/magic.py");` (2认同)

小智 21

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

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


fif*_*nce 14

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

$command = 'ls';
exec($command, $out, $status);
Run Code Online (Sandbox Code Playgroud)

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

如果您还想查看stderr输出,可以使用proc_open或只是添加2>&1到您的$command.后者通常足以使工作更快并且"更快"地"实施".


小智 9

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

sudoers文件: sudo visudo

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

  • 将www-data添加到sudoers似乎没有效果,并为apache提供了所需的更多权限.为您正在执行的脚本提供www-data权限就足够了. (6认同)

Tim*_*man 5

就我而言,我需要在www名为scripts. 在里面scripts我添加了一个名为test.py.

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

然后我转到新scripts目录并使用sudo chmod +x test.py.

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

#!/usr/bin/env python3.5
print("Hello World!")
Run Code Online (Sandbox Code Playgroud)

从 php 我现在这样做:

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

你应该看到:Hello World!


SMs*_*ant 5

上面的方法看起来很复杂。使用我的方法作为参考。

我有这两个文件:

  • 运行.php

  • 目录

在这里,我创建了一个包含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";
	}
?>
Run Code Online (Sandbox Code Playgroud)

目录

#!/usr/bin/env python    
import os    
os.makedirs("thisfolder");
Run Code Online (Sandbox Code Playgroud)


Agn*_*hal 5

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

exec() -执行外部程序

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

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

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