Estou tentando executar um script Python em PHP usando o seguinte comando:
exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
No entanto, o PHP simplesmente não produz nenhuma saída. O relatório de erros é definido como E_ALL e display_errors está ativado.
Aqui está o que tentei:
- Eu usei
python2
,/usr/bin/python2
e empython2.7
vez de/usr/bin/python2.7
- Também usei um caminho relativo em vez de um caminho absoluto, que também não mudou nada.
- Eu tentei usar os comandos
exec
,shell_exec
,system
.
No entanto, se eu correr
if (exec('echo TEST') == 'TEST')
{
echo 'exec works!';
}
funciona perfeitamente bem enquanto shutdown now
não faz nada.
O PHP tem permissão para acessar e executar o arquivo.
EDIT: Graças a Alejandro, consegui resolver o problema. Se você tiver o mesmo problema, não se esqueça que seu servidor da web provavelmente / espero que não execute como root. Tente fazer login como o usuário do seu servidor web ou um usuário com permissões semelhantes e tente executar os comandos você mesmo.
Respostas:
Testado no Ubuntu Server 10.04. Espero que ajude você também no Arch Linux.
Em PHP, use a função shell_exec :
No arquivo Python
test.py
, verifique este texto na primeira linha: (consulte a explicação do shebang) :Além disso, o arquivo Python deve ter privilégios corretos (execução para o usuário www-data / apache se o script PHP for executado no navegador ou curl) e / ou deve ser "executável". Além disso, todos os comandos no
.py
arquivo devem ter privilégios corretos:Retirado do manual do php :
Para tornar um arquivo executável em plataformas do tipo Unix :
fonte
echo shell_exec("/usr/local/bin/python3 /Users/cyborg/Dev/magic.py");
ou:echo shell_exec("/usr/bin/python /Users/cyborg/Dev/magic.py");
Eu recomendo usar
passthru
e manipular o buffer de saída diretamente:fonte
Se você deseja saber o status de retorno do comando e obter toda a
stdout
saída, pode realmente usarexec
:$out
é uma matriz de todas as linhas.$status
é o status de retorno. Muito útil para depuração.Se você também quiser ver a
stderr
saída, pode brincar com proc_open ou simplesmente adicionar2>&1
ao seu$command
. O último geralmente é suficiente para fazer as coisas funcionarem e muito mais rápido para "implementar".fonte
Alejandro acertou em cheio, acrescentando um esclarecimento à exceção (Ubuntu ou Debian) - não tenho o representante para acrescentar à própria resposta:
arquivo sudoers:
sudo visudo
exceção adicionada:
www-data ALL=(ALL) NOPASSWD: ALL
fonte
Para esclarecer qual comando usar com base na situação
exec()
- Executar um programa externosystem()
- Executar um programa externo e exibir a saídapassthru()
- Executar um programa externo e exibir a saída brutaFonte: http://php.net/manual/en/function.exec.php
fonte
No meu caso precisei criar uma nova pasta no
www
diretório chamadoscripts
. Dentroscripts
eu adicionei um novo arquivo chamadotest.py
.Então usei
sudo chown www-data:root scripts
esudo chown www-data:root test.py
.Então fui para o novo
scripts
diretório e useisudo chmod +x test.py
.Meu arquivo test.py se parece com isso. Observe a versão diferente do Python:
No php, agora faço o seguinte:
E você deverá ver: Hello World!
fonte
Os métodos acima parecem complexos. Use meu método como referência.
Eu tenho estes dois arquivos:
run.php
mkdir.py
Aqui, criei uma página HTML que contém um GObotão. Sempre que você pressionar este botão, uma nova pasta será criada no diretório cujo caminho você mencionou.
run.php
mkdir.py
fonte
Isso é tão trivial, mas só queria ajudar quem já seguiu a sugestão de Alejandro, mas encontrou este erro:
Se alguém encontrou esse erro, uma pequena alteração precisa ser feita no arquivo php por Alejandro:
fonte