从PHP运行Python脚本
我正在尝试使用以下命令从PHP运行Python脚本:从PHP运行Python脚本,php,python,linux,exec,archlinux,Php,Python,Linux,Exec,Archlinux,我正在尝试使用以下命令从PHP运行Python脚本: exec('/usr/bin/python2.7/srv/http/assets/py/switch.pyarg1 arg2') 然而,PHP根本不产生任何输出。错误报告设置为E_ALL,并且“显示错误”处于启用状态 以下是我尝试过的: 我使用了python2、/usr/bin/python2和python2.7而不是/usr/bin/python2.7 我还使用了相对路径而不是绝对路径,这也不会改变任何东西 我尝试使用命令exec,she
exec('/usr/bin/python2.7/srv/http/assets/py/switch.pyarg1 arg2')代码>
然而,PHP根本不产生任何输出。错误报告设置为E_ALL,并且“显示错误”处于启用状态
以下是我尝试过的:
- 我使用了
python2
、/usr/bin/python2
和python2.7
而不是/usr/bin/python2.7
- 我还使用了相对路径而不是绝对路径,这也不会改变任何东西
- 我尝试使用命令
exec
,shell\u exec
,system
但是如果我跑
if (exec('echo TEST') == 'TEST')
{
echo 'exec works!';
}
它可以很好地工作,而立即关闭
没有任何作用
PHP拥有访问和执行该文件的权限
编辑:多亏了亚历杭德罗,我才解决了这个问题。如果您有同样的问题,请不要忘记您的Web服务器可能/希望不是以root用户身份运行的尝试以Web服务器的用户或具有类似权限的用户身份登录,并尝试自己运行这些命令。在Ubuntu服务器10.04上测试。我希望它在ArchLinux上也能帮助您
在PHP中:
通过shell执行命令并以字符串形式返回完整的输出
它返回已执行命令的输出,如果出现错误,则返回NULL
发生或该命令不产生任何输出
如果安装了多个版本的Python,/usr/bin/env将
确保使用的解释器是您环境的
$PATH。另一种选择是硬编码,比如
#!/usr/bin/python;没关系,但灵活性较低
在Unix中,要解释的可执行文件可以指示
有一个#使用什么样的解释器!在第一行的开头,
后跟解释器(以及它可能需要的任何标志)
当然,如果你说的是其他平台,这条规则并不适用
应用(但“shebang行”并没有坏处,如果你有机会,它也会有帮助
将该脚本复制到基于Unix的平台,如Linux,
Mac等)
这适用于在Unix中通过使其可执行来运行它
(chmod+x myscript.py),然后直接运行它:./myscript.py,
而不仅仅是python myscript.py
致:
还有Python文件(如果PHP脚本在浏览器或curl中运行,则为用户www data/apache执行)
和/或必须是“可执行的”。此外,.py
文件中的所有命令必须具有正确的权限
采取:
这只是一个简短的提醒,提醒那些试图在计算机上使用shell_exec的人
unix类型的平台,并且似乎无法使其工作。PHP执行为
系统上的web用户(通常是Apache的www),因此您需要
确保web用户有权访问任何文件或文件
您试图在shell_exec命令中使用的目录。
另一方面,它似乎什么也没做
我建议使用passthru
并直接处理输出缓冲区:
ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean();
Alejandro抓住了这一点,为例外添加了澄清(Ubuntu或Debian)-我没有代表来补充答案本身:
sudoers文件:
sudo-visudo
添加的例外情况:
www-data-ALL=(ALL)NOPASSWD:ALL
如果您想知道命令的返回状态并获得整个stdout
输出,您可以实际使用exec
:
$command = 'ls';
exec($command, $out, $status);
$out
是所有行的数组<代码>$status
是返回状态。对调试非常有用
如果您还想查看
stderr
输出,您可以使用2>&1
或将添加到$命令中。后者通常足以让事情运转起来,并以更快的方式“实现”。在我的例子中,我需要在www
目录中创建一个名为scripts
的新文件夹。在scripts
中,我添加了一个名为test.py
的新文件
然后我使用了sudo-chown www-data:root脚本
和sudo-chown-www-data:root-test.py
然后我转到新的scripts
目录并使用sudo chmod+x test.py
我的test.py文件看起来像这样。请注意不同的Python版本:
#!/usr/bin/env python3.5
print("Hello World!")
从php中,我现在可以执行以下操作:
$message = exec("/var/www/scripts/test.py 2>&1");
print_r($message);
你应该看到:你好,世界 这太微不足道了,但只是想帮助那些已经听从亚历杭德罗建议但遇到错误的人:
sh:blabla.py:未找到命令
如果有人遇到该错误,那么Alejandro需要对php文件进行一些更改:
$command = escapeshellcmd('python blabla.py');
上述方法似乎很复杂。用我的方法作为参考
我有两个文件:
- run.php
- mkdir.py
在这里,我创建了一个包含GO按钮的HTML页面。无论何时按下此按钮,都会在您提到的目录中创建一个新文件夹
run.php
跑
根据情况明确使用哪个命令
exec()
-执行外部程序
system()
-执行外部程序并显示输出
passthru()
-执行外部程序并显示原始输出
来源:灵感来源于亚历杭德罗·奎罗斯:
<?php
$command = escapeshellcmd('python test.py');
$output = shell_exec($command);
echo $output;
?>
需要添加Python,不需要路径。以上所有选项都会创建新的系统进程。这是一场表演噩梦。
为此,我将PHP模块与对Python的“透明”调用缝合在一起
编译起来可能很棘手,但它可以保存系统进程,并让您在PHP调用之间保持Python运行时。谢谢,这就成功了!还有一个问题——Apache用户无法在Python脚本中执行命令,但我可以通过使用sudo并在sudo中添加脚本的异常来解决这个问题
$message = exec("/var/www/scripts/test.py 2>&1");
print_r($message);
$command = escapeshellcmd('python blabla.py');
<?php
$command = escapeshellcmd('python test.py');
$output = shell_exec($command);
echo $output;
?>