136

次のコマンドを使用して、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_execsystem

ただし、実行すると

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

shutdown now何もしない間は完全に正常に動作します。

PHP には、ファイルにアクセスして実行する権限があります。

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

4

10 に答える 10

193

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 Explain を参照) :

#!/usr/bin/env python

Python の複数のバージョンがインストールされている場合、/usr/bin/env は、使用されるインタープリターが環境の $PATH の最初のものであることを保証します。別の方法は、 #!/usr/bin/python; のようなものをハードコードすることです。それは問題ありませんが、柔軟性が低くなります。

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

もちろん、他のプラットフォームについて話している場合、このルールは適用されません (しかし、その「シバン行」は害を及ぼすものではなく、そのスクリプトを Linux や Mac などの Unix ベースのプラットフォームにコピーする場合に役立ちます)。など)。

これは、Unix で実行可能 (chmod +x myscript.py) にしてから、python myscript.py だけでなく、./myscript.py で直接実行する場合に適用されます。

unix タイプのプラットフォームで実行可能ファイルを作成するには、次のようにします。

chmod +x myscript.py

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

PHPマニュアルから取得

unix タイプのプラットフォームで shell_exec を使用しようとしていて、うまく動作しないように思われる方への簡単なリマインダーです。PHP はシステム上で Web ユーザー (通常は Apache の場合は www) として実行されるため、shell_exec コマンドで使用しようとしているファイルやディレクトリに対する権限が Web ユーザーにあることを確認する必要があります。そうでなければ、何もしていないように見えます。

于 2013-11-01T22:34:58.963 に答える
16

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

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

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

出力も見たい場合は、 proc_openstderrで遊ぶか、単純に. 後者は多くの場合、物事を機能させ、「実装」を高速化するのに十分です。2>&1$command

于 2015-09-18T18:19:01.317 に答える
8

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

sudoers ファイル: sudo visudo

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

于 2014-07-27T22:19:04.393 に答える
5

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

次の 2 つのファイルがあります。

  • run.php

  • mkdir.py

GOここでは、ボタンを含む HTML ページを作成しました。このボタンを押すたびに、指定したパスのディレクトリに新しいフォルダーが作成されます。

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");
于 2018-06-20T11:08:19.590 に答える