web-dev-qa-db-ja.com

PHPからPythonスクリプトを実行する

次のコマンドを使用して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を使用しました
  • 私も絶対パスの代わりに相対パスを使いました。
  • コマンドexecShell_execsystemを使用してみました。

しかし、私が走れば

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

shutdown nowは何もしませんが、それは完璧に動作します。

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

編集:アレハンドロのおかげで、私は問題を解決することができた。あなたが同じ問題を抱えているならば、あなたのウェブサーバはおそらく/うまくいけばrootとして動かないことを忘れないでください。 あなたのWebサーバのユーザ、または同様の権限を持つユーザとしてログインし、自分でコマンドを実行してみてください。

97

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ファイル 正しい権限を持っている必要があります (PHPスクリプトがブラウザまたはcurlで実行される場合は、www-data/Apacheユーザーの実行)および/または "実行可能"である必要があります。 .pyファイルへのすべてのコマンドは正しい特権を持っている必要があります。

撮影された phpのマニュアルから

UnixタイプのプラットフォームでShell_execを使おうとしていて、うまく動かないように思われる方々へのちょっとしたメモです。 PHPはシステム上のWebユーザーとして実行され(通常はApacheの場合はwww)、そのWebユーザーがShell_execコマンドで使用しようとしているファイルまたはディレクトリに対する権限を持っていることを確認する必要があります。それ以外の点では、何もしていないようです。

実行可能ファイルをUNIXタイプのプラットフォーム上のファイルにする

chmod +x myscript.py
135

passthruを使用して、出力バッファを直接処理することをお勧めします。

ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean(); 
20
Niklas Lindblad

コマンドの戻り状況を知り、stdoutの出力全体を取得したい場合は、実際にexecを使用できます

$command = 'ls';
exec($command, $out, $status);

$outはすべての行の配列です。 $statusは戻り状況です。デバッグに非常に便利です。

stderrの出力も見たい場合は、 proc_open で遊ぶか、単に2>&1$commandに追加してください。後者は、物事を動かし、「実装」するための方法をもっと早くするのに十分なものです。

13
guaka

Alejandroはそれを釘付けにし、例外を明確にしました(UbuntuまたはDebian) - 私は回答自体に追加する担当者がいません:

sudoersファイル:Sudo visudo

例外が追加されました:www-data ALL=(ALL) NOPASSWD: ALL

9
Colin Miles

状況に応じて使用するコマンドを明確にする

exec() - 外部プログラムを実行する

system() - 外部プログラムを実行して出力を表示する

passthru() - 外部プログラムを実行して生の出力を表示する

ソース: http://php.net/manual/en/function.exec.php

4
Agnel Vishal

私の場合、wwwディレクトリにscriptsという新しいフォルダを作成する必要がありました。 scripts内にtest.pyという新しいファイルを追加しました。

それから私はSudo chown www-data:root scriptsSudo chown www-data:root test.pyを使いました。

それから私は新しいscriptsディレクトリに行き、Sudo chmod +x test.pyを使いました。

私のtest.pyファイルはこんな感じです。 Pythonのバージョンが異なることに注意してください。

#!/usr/bin/env python3.5
print("Hello World!")

PHPから私は今これを行います:

$message = exec("/var/www/scripts/test.py 2>&1");
print_r($message);

そして、あなたは見るべきです:Hello World!

3
Tim Hallman

上記の方法は複雑なようです。私の方法を参考にしてください。

私はこれら二つのファイルを持っています:

  • run.php

  • mkdir.py

ここで、私はHTMLページを作成しました。 GO ボタン。このボタンを押すたびに、あなたが言及したパスを持つディレクトリに新しいフォルダが作成されます。

run.php

<html>
 <body>
  <head>
   <title>
     run
   </title>
  </head>

   <form method="post">

    <input type="submit" value="GO" name="GO">
   </form>
 </body>
</html>

<?php
        if(isset($_POST['GO']))
        {
                Shell_exec("python /var/www/html/lab/mkdir.py");
                echo"success";
        }
?>

mkdir.py

#!/usr/bin/env python    
import os    
os.makedirs("thisfolder");
2
Smshrimant

これはそれほど簡単なことではありませんが、すでにAlejandroの提案に従うがこのエラーに遭遇した人を手助けしたいだけでした。

sh:blabla.py:コマンドが見つかりません

誰かがそのエラーに遭遇したなら、Alejandroによってphpファイルに少しの変更がなされる必要があります。

$command = escapeshellcmd('python blabla.py');
1
Gerald Joshua