Я хочу выполнить скрипт Python из файла PHP. Я могу выполнить простой сценарий Python, как:

print("Hello World") 

Но когда я хочу выполнить следующий скрипт, ничего не происходит

from pydub import AudioSegment
AudioSegment.converter = "/usr/bin/ffmpeg"
sound = AudioSegment.from_file("/var/www/dev.com/public_html/track.mp3")
sound.export("/var/www/dev.com/public_html/test.mp3", format="mp3", bitrate="96k")

И тот же скрипт работает нормально, когда я выполняю его из терминала. вот мой скрипт php:

$output = shell_exec("/usr/bin/python /var/www/dev.com/public_html/index.py");
echo $output;

Я также попробовал следующий метод, но не повезло:

$output = array();
$output = passthru("/usr/bin/python /var/www/dev.com/public_html/index.py");
print_r($output);

Помогите мне, пожалуйста

11
Rajinder 28 Фев 2018 в 18:05

5 ответов

Лучший ответ

Функция PHP passthru не имеет элегантного метода, для которого вы можете искать передаваемые переменные окружения. Если вы должны использовать passthru, экспортируйте переменные непосредственно в команду:

passthru("SOMEVAR=$yourVar PATH=$newPATH ... /path/to/executable $arg1 $arg2 ...")

Если вы склонны к shell_exec, вы можете оценить putenv за немного более чистый интерфейс:

putenv("SOMEVAR=$yourVar");
putenv("PATH=$newPATH");
echo shell_exec("/path/to/executable $arg1 $arg2 ...");

Если вы открыты для более надежного (если утомительного) подхода, рассмотрите {{X0 } } :

$cmd = "/path/to/executable arg1 arg2 ..."

# Files 0, 1, 2 are the standard "stdin", "stdout", and "stderr"; For details
# read the PHP docs on proc_open.  The key here is to give the child process a
# pipe to write to, and from which we will read and handle the "passthru"
# ourselves
$fileDescriptors = array(
    0 => ["pipe", "r"],
    1 => ["pipe", "w"],
    2 => ["pipe", "w"]
);

$cwd = '/tmp';
$env = [
    'PATH' => $newPATH,
    'SOMEVAR' => $someVar,
    ...
];

# "pHandle" = "Process handle".  Note that $pipes is new here, and will be
# given back to us
$pHandle = proc_open($cmd, $fileDescriptors, $pipes, $cwd, $env);

# crucial: did proc_open work?
if ( is_resource( $pHandle ) ) {
    # $pipes is now valid
    $pstdout = $pipes[ 1 ];

    # Hey, whaddya know?  PHP has just what we need...
    fpassthru( $pstdout );

    # Whenever you proc_open, you must also proc_close.  Just don't
    # forget to close any open file handles
    fclose( $pipes[0] );
    fclose( $pipes[1] );
    fclose( $pipes[2] );
    proc_close( $pHandle );
}
4
hunteke 9 Мар 2018 в 13:53

Согласно вашему ответу, как вы хотите выполнить скрипт Python из PHP

Я смог выполнить его, используя следующий код

$command = escapeshellcmd('/var/www/yourscript.py');
$output = shell_exec($command);
echo $output;

Пожалуйста, используйте приведенный выше код PHP с тем же скриптом Python. Попробуйте сначала запустить сценарий python как сценарий GCI, чтобы убедиться, что он работает, и установите разрешения для общего каталога и сценария, как я уже упоминал ранее.

=================== старый и ============================

Из того, что вы спросили, я думаю, вы пытаетесь запустить его как скрипт CGI, например Http: //localhost/yourscript.py

И почему вы используете PHP для выполнения скрипта Python, когда вы можете запустить его непосредственно как скрипт CGI?

Вот что вам нужно сделать, чтобы он работал как веб-страница:

  1. включить Python CGI в Apache (или на веб-сервере, который вы используете).
  2. положить сценарий в CGI настроенный каталог
  3. добавьте правильный код в ваш скрипт, чтобы он работал как скрипт CGI
#!/usr/local/bin/python
from pydub import AudioSegment
AudioSegment.converter = "/usr/local/bin/ffmpeg"
sound = AudioSegment.from_file("/var/www/dev.com/public_html/track.mp3")
sound.export("/var/www/dev.com/public_html/test.mp3", format="mp3", bitrate="96k")

print "Content-type: text/html"
print
print ""
print ""
print ""
print "Done/ you can perform some conditions and print useful info here"
print ""
  1. Дайте разрешения сценарию и сделайте общедоступный каталог доступным для записи
  2. Откройте скрипт http: //localhost/your-path-to-script.py

Я смог запустить это правильно. дайте мне знать, если это не ваш случай, если вы хотите что-то еще

1
joginder singh 3 Мар 2018 в 11:33

Вы также можете выполнить ffmpeg напрямую без python:

$output = shell_exec("/usr/bin/ffmpeg -i in.mp3 -b:a 96k out.mp3");
echo $output;

ffmpeg документы

0
iwex 9 Мар 2018 в 14:48

В моем случае я сделал этот код.

<?php
chdir('/home/pythontest') ; // python code dir
$commandline="/usr/bin/python3 test.py parameter" ;
exec($commandline, $output, $error) ;
echo $output ;
?>

Если вам нужно установить некоторые среды для python, добавьте переменные среды, подобные этой.

$commmandline="LANG=en_US.utf8 LC_ALL=en_US.utf8 /usr/bin/python3 ..." ;

И проверьте журнал httpd.

2
Junhee Shin 6 Мар 2018 в 08:04

Проверьте это.

Пользователь apache должен находиться в файле sudoers, лучше не давать sudo apache, а дать пользователю apache (www-data) право на запуск вашей программы на python

Поместите первую строку в вашем скрипте Python: #!/usr/bin/env python, чтобы скрипт знал, с какой программой открыть его ..

Тогда,

Изменить группу:

chgrp www-data /path/to/python-script.py

Сделать его исполняемым:

chmod +x /path/to/python-script.py

Затем попробуйте:

shell_exec("/path/to/python-script.py");

Я надеюсь, что это будет работать! :)

1
Abdullah Ahmed Ghaznavi 8 Мар 2018 в 05:10