次のコマンドを使用してPHPからPythonスクリプトを実行しようとしています。
exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
しかし、PHPは単に出力を生成しません。エラー報告はE_ALLに設定され、display_errorsはオンです。
これが私が試したものです:
python2
の代わりに/usr/bin/python2
、python2.7
および/usr/bin/python2.7
を使用しましたexec
、Shell_exec
、system
を使用してみました。しかし、私が走れば
if (exec('echo TEST') == 'TEST')
{
echo 'exec works!';
}
shutdown now
は何もしませんが、それは完璧に動作します。
PHPはファイルにアクセスして実行する権限を持っています。
編集:アレハンドロのおかげで、私は問題を解決することができた。あなたが同じ問題を抱えているならば、あなたのウェブサーバはおそらく/うまくいけばrootとして動かないことを忘れないでください。 あなたのWebサーバのユーザ、または同様の権限を持つユーザとしてログインし、自分でコマンドを実行してみてください。
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
passthru
を使用して、出力バッファを直接処理することをお勧めします。
ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean();
コマンドの戻り状況を知り、stdout
の出力全体を取得したい場合は、実際にexec
を使用できます。
$command = 'ls';
exec($command, $out, $status);
$out
はすべての行の配列です。 $status
は戻り状況です。デバッグに非常に便利です。
stderr
の出力も見たい場合は、 proc_open で遊ぶか、単に2>&1
を$command
に追加してください。後者は、物事を動かし、「実装」するための方法をもっと早くするのに十分なものです。
Alejandroはそれを釘付けにし、例外を明確にしました(UbuntuまたはDebian) - 私は回答自体に追加する担当者がいません:
sudoersファイル:Sudo visudo
例外が追加されました:www-data ALL=(ALL) NOPASSWD: ALL
状況に応じて使用するコマンドを明確にする
exec()
- 外部プログラムを実行する
system()
- 外部プログラムを実行して出力を表示する
passthru()
- 外部プログラムを実行して生の出力を表示する
私の場合、www
ディレクトリにscripts
という新しいフォルダを作成する必要がありました。 scripts
内にtest.py
という新しいファイルを追加しました。
それから私はSudo chown www-data:root scripts
とSudo 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!
上記の方法は複雑なようです。私の方法を参考にしてください。
私はこれら二つのファイルを持っています:
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");
これはそれほど簡単なことではありませんが、すでにAlejandroの提案に従うがこのエラーに遭遇した人を手助けしたいだけでした。
sh:blabla.py:コマンドが見つかりません
誰かがそのエラーに遭遇したなら、Alejandroによってphpファイルに少しの変更がなされる必要があります。
$command = escapeshellcmd('python blabla.py');