1. ホーム
  2. php

[解決済み】PHPからPythonスクリプトを実行する

2022-02-12 16:17:59

質問

PHPから以下のコマンドでPythonスクリプトを実行しようとしています。

exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');

しかし、PHPは単に何も出力しません。エラー報告は E_ALL に設定され、display_errors はオンになっています。

以下は、試した内容です。

  • を使いました。 python2 , /usr/bin/python2python2.7 ではなく /usr/bin/python2.7
  • また、絶対パスの代わりに相対パスを使用しましたが、これも何も変わりませんでした。
  • コマンドを使用してみました。 exec , shell_exec , system .

しかし

if (exec('echo TEST') == 'TEST')
{
    echo 'exec works!';
}

の間、全く問題なく動作します。 shutdown now は何もしない。

PHPはファイルにアクセスし、実行する権限を持っています。

EDIT: Alejandroのおかげで、問題を解決することができました。同じ問題がある場合、あなたのウェブサーバーはおそらく/うまくいけばrootとして実行されていないことを忘れないでください。 ウェブサーバーのユーザー、またはそれに近い権限を持つユーザーでログインし、自分でコマンドを実行してみてください。

解決するには?

Ubuntu Server 10.04でテストしています。Arch Linuxでもお役に立てれば幸いです。

PHPの場合 shell_exec関数を使用する :

シェル経由でコマンドを実行し、その全出力を文字列として返す。

実行されたコマンドの出力を返しますが、エラーが発生した場合はNULLを返します。 が発生した場合、またはコマンドが何も出力しない場合。

<?php 

$command = escapeshellcmd('/usr/custom/test.py');
$output = shell_exec($command);
echo $output;

?>

Pythonファイルへ test.py 最初の行でこのテキストを確認します。 (shebangの説明を参照) :

#!/usr/bin/env python

複数のバージョンのPythonがインストールされている場合、/usr/bin/envは 使用するインタープリタが、あなたの環境の PATH。別の方法としては、次のようなハードコードになります。 #それはそれでいいのですが、柔軟性に欠けます。

Unixでは、解釈されることを前提とした実行可能ファイルは どのインタープリタを使うかは、最初の行の先頭に#! その後にインタプリタ(と必要なフラグ)が続きます。

もちろん、他のプラットフォームについて話す場合は、このルールは適用されません。 が適用されます(ただし、この "shebang 行" は害にはなりませんし、もしあなたが そのスクリプトをLinuxのようなUnixベースのプラットフォームにコピーしてください。 Macなど)。

<ブロッククオート

Unixで実行可能にして実行した場合にも適用されます。 (chmod +x myscript.py)してから、直接実行します: ./myscript.py, python myscript.pyというより、むしろ

への unix系プラットフォームでファイルを実行可能にする :

chmod +x myscript.py

また、Pythonファイル は正しい権限を持っている必要があります。 (PHPスクリプトがブラウザまたはcurlで実行される場合、ユーザーwww-data / apacheの実行) また、quot;実行可能でなければなりません。また、すべてのコマンドは .py ファイルは正しい権限を持っている必要があります。

撮影 phpマニュアルより :

shell_execを使用しようとしている人のための簡単な注意事項です。 unix系のプラットフォームで、うまく動作させることができないようです。PHPは、以下のように実行されます。 システム上のウェブユーザー(Apacheの場合は通常www)である。 ウェブユーザーが、ファイルまたは ディレクトリを使用します。 そうでなければ、何もしていないように見えるでしょう。