'unable to execute python script from php

I want to execute Python script from PHP file. I am able to execute simple python script like:

print("Hello World") 

but when I want to execute following script, nothing happens

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

and same script works fine when I execute it from terminal. here is my php script:

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

I have also tried following method but no luck:

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

please help me



Solution 1:[1]

Acc to your reply, as you want to execute the python script from PHP

I was able to execute it using the following code

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

Please use the above PHP code with the same python script. Try to run the python script as a GCI script first to make sure it is working and set the permissions to public directory and script as I mentioned before

===================old ans============================

From what you asked, I guess this is what you are trying to do is that you are trying to run it as a CGI script like http://localhost/yourscript.py

And why are you using PHP to execute python script when you can run it directly as a CGI script?

here is what you need to do to make it work like a web page:

  1. enable python CGI in apache ( or in the web server you are using ).
  2. put the script in CGI configured directory
  3. add proper code to your script to make it work as a CGI script
#!/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. Give permissions to the script and make the public directory writable
  2. Access the script http://localhost/your-path-to-script.py

I was able to run this properly. let me know if that's not your case if you want something else

Solution 2:[2]

In my case, I did this code.

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

If you need to set some environments for python, add environment vars like this.

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

and check the httpd log.

Solution 3:[3]

Check this:

The apache user has to be in sudoers file, better you don't give sudo to apache instead give apache (www-data) user right to run your python program

put first line in your python script: #!/usr/bin/env python so the script knows which program to open it with..

then,

change group:

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

make it executabe:

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

then try it:

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

I hope this will work! :)

Solution 4:[4]

You can also exec ffmpeg directly without python:

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

ffmpeg docs

Solution 5:[5]

Answered in 2022.

In php 8.0 and above the following method worked. Above answers are very useful but i am compiling few extra steps here.

PHP Code.

$output = shell_exec("python3 /var/www/python/test.py");
print_r($output);

exec('python3 --version 2>&1', $output);
var_dump($output);

Trying both shell_exe and exec

  1. Make sure the python file has executable permission and added to www-data group (if its ubuntu/debian systems) . sudo chmod +x test.py and sudo chgrp www-data test.py

  2. Make sure the php.ini has disabled_functions line commented or empty.

sudo vim sudo vim /etc/php/8.0/cli/php.ini sudo vim sudo vim /etc/php/8.0/apache2/php.ini

For both.

I compiled a simple video to make sure others dont spend more time figuring out the problem. https://youtu.be/t-f6b71jyoM

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Junhee Shin
Solution 3 Abdullah Ahmed Ghaznavi
Solution 4 iwex
Solution 5 abdul rashid