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
4 Answers
Answers 1
PHP's passthru
function does not have the elegant method for which you may be searching of passing environment variables. If you must use passthru
, then export your variables directly in the command:
passthru("SOMEVAR=$yourVar PATH=$newPATH ... /path/to/executable $arg1 $arg2 ...")
If you are inclined toward shell_exec
, you may appreciate putenv
for the slightly cleaner interface:
putenv("SOMEVAR=$yourVar"); putenv("PATH=$newPATH"); echo shell_exec("/path/to/executable $arg1 $arg2 ...");
If you are open to a more robust (if tedious) approach, consider proc_open
:
$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 ); }
Answers 2
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:
- enable python CGI in apache ( or in the web server you are using ).
- put the script in CGI configured directory
- 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 ""
- Give permissions to the script and make the public directory writable
- 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
Answers 3
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.
Answers 4
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! :)
0 comments:
Post a Comment