无法从php执行python脚本

时间:2018-02-28 15:05:49

标签: php python

我想从PHP文件中执行Python脚本。我能够执行简单的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);

请帮帮我

4 个答案:

答案 0 :(得分:1)

根据你的回复,因为你想从PHP执行python脚本

我能够使用以下代码

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

请使用上面的PHP代码和相同的python脚本。 尝试首先将python脚本作为GCI脚本运行以确保它正常工作并将权限设置为我之前提到的公共目录和脚本

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

根据您的要求,我想您要尝试的是尝试将其作为CGI脚本运行,例如http://localhost/yourscript.py

当你可以直接将它作为CGI脚本运行时,为什么使用PHP来执行python脚本呢?

您需要做的就是让它像网页一样工作:

  1. 在apache中(或在您正在使用的Web服务器中)启用python CGI。
  2. 将脚本放入CGI配置目录
  3. 为脚本添加适当的代码以使其作为CGI脚本工作
  4. #!/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
    3. 我能够正确地运行它。 如果你想要其他东西,请告诉我你的情况是不是

答案 1 :(得分:1)

就我而言,我做了这段代码。

<?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 :(得分:1)

检查一下:

apache用户必须在sudoers文件中,最好不要给apache sudo而不是给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");

我希望这会奏效! :)

答案 3 :(得分:0)

你也可以直接执行ffmpeg而不用python:

    var projection = ol.proj.get('EPSG:4326');
    var raster = new ol.layer.Tile({
        source: new ol.source.OSM()
    });

    var layer1 = new ol.layer.Vector({
      source: new ol.source.Vector({
        url: 'http://localhost/maptest/test.kml',
        format: new ol.format.KML()
    })
  });

    var layer11 = new ol.layer.VectorTile({
      source: new ol.source.VectorTile({
        url: 'http://localhost/maptest/test.kml',
        format: new ol.format.KML({
          extractStyles: false
      }),
    }),
      opacity: 2,   
  });

    //**the code to get value from checkbox**
    var filter_options=[raster];
    $('input:checkbox').click(function()
    {
        var name=$(this).val().trim();
        if(this.checked)
        {
            filter_options.push(name);
            console.log('Add: ' + name);
        }
        else
        {
            var index=filter_options.indexOf(name);
            if(index > -1)
            {
                filter_options.splice(index, 1);
                console.log('Remove: ' + name + ' at index: ' + index);
            }
        }
        $('#result').html(filter_options.join('; '));
        console.log(filter_options);
    });


    var map = new ol.Map({
        layers : [raster, layer1, layer11] //this works
        layers: filter_options, //this doesnt work, the map wont shoq the layers
        target: document.getElementById('map'),
        view: new ol.View({
          center: [ 29.8187, 32.3275],
          projection: projection,
          zoom: 10,
      })
    });

ffmpeg docs