2012-01-02 26 views
6

PHPスクリプトからPythonスクリプトを実行する際に問題が発生しています。私のクライアントはBluehostを使用していますので、ここで説明しているeasy_installメソッドを使用してPython用のサードパーティ製モジュール(numpy)をインストールしました:https://my.bluehost.com/cgi/help/530?step=530PHPスクリプトがPythonスクリプトから出力を取得できない

私は2つのpythonスクリプトとPHPスクリプトを作成しました。

hello.pyは含まれています

print "Hello, World!" 

hello-numpy.pyは含まれています

import numpy 
print "Hello, World!" 

PHPスクリプトが含まれています

Output from exec('python hello.py'): <?php echo exec('python hello.py'); ?><br> 
Output from exec('python hello-numpy.py'): <?php echo exec('python hello-numpy.py'); ?><br> 
Output from exec('whoami'): <?php echo exec('whoami'); ?> 

私は、PHPからこの出力を得ます:

Output from exec('python hello.py'): Hello, World!
Output from exec('python hello-numpy.py'):
Output from exec('whoami'): venicetw

しかし、SSHウィンドウからこれらのスクリプトを実行すると、以下の結果が得られます。

# python hello.py 
Hello, World! 
# python hello-numpy.py 
Hello, World! 
# whoami 
venicetw 

Pythonスクリプトの輸入がnumpyの際にPHPが任意の出力を取得していないようだが、それはSSHから正常に動作します。さらに、PHPはhello.pyでは0、hello-numpy.pyでは1を返します。私はそれが許可の問題かもしれないと思ったが、PHPとSSHの両方が "venicetw"ユーザとして実行されている。 PHPとApacheがPythonスクリプトからの出力を得られないのはなぜですか?それは私がBluehostと、または私が確認すべき他の何かと議論することができる何か? Apache 2.2.21,PHP 5.2.17,Python 2.4.3およびnumpy 1.6.0を使用しています。

更新: SSHは、次のPythonパスを出力します。

/home8/venicetw/public_html/venicenoise/python 
/home8/venicetw/.local/lib/python2.4/site-packages/ogcserver-0.1.0-py2.4.egg 
/home8/venicetw/.local/lib/python2.4/site-packages/PIL-1.1.7-py2.4-linux-x86_64.egg 
/home8/venicetw/.local/lib/python2.4/site-packages/lxml-2.3.2-py2.4-linux-x86_64.egg 
/home8/venicetw/.local/lib/python2.4/site-packages/WebOb-1.2b2-py2.4.egg 
/home8/venicetw/.local/lib/python2.4/site-packages/PasteScript-1.7.5-py2.4.egg 
/home8/venicetw/.local/lib/python2.4/site-packages/PasteDeploy-1.5.0-py2.4.egg 
/home8/venicetw/.local/lib/python2.4/site-packages/Paste-1.7.5.1-py2.4.egg 
/home8/venicetw/.local/lib/python2.4/site-packages/numpy-1.6.0-py2.4-linux-x86_64.egg 
/home8/venicetw/.local/lib/python2.4/site-packages 
/home8/venicetw/.local/lib/python/site-packages 
/home8/venicetw/public_html/venicenoise/python 
/usr/lib64/python24.zip 
/usr/lib64/python2.4 
/usr/lib64/python2.4/plat-linux2 
/usr/lib64/python2.4/lib-tk 
/usr/lib64/python2.4/lib-dynload 
/usr/lib64/python2.4/site-packages 
/usr/lib64/python2.4/site-packages/Numeric 
/usr/lib64/python2.4/site-packages/PIL 
/usr/lib64/python2.4/site-packages/gtk-2.0 
/usr/lib/python2.4/site-packages 

しかし、ApacheはこれらのみPythonのパスを出力します。

/home8/venicetw/public_html/venicenoise/python 
/usr/lib64/python24.zip 
/usr/lib64/python2.4 
/usr/lib64/python2.4/plat-linux2 
/usr/lib64/python2.4/lib-tk 
/usr/lib64/python2.4/lib-dynload 
/usr/lib64/python2.4/site-packages 
/usr/lib64/python2.4/site-packages/Numeric 
/usr/lib64/python2.4/site-packages/PIL 
/usr/lib64/python2.4/site-packages/gtk-2.0 
/usr/lib/python2.4/site-packages 

ソリューション:から実行するの/ usr/binに/ envをすることでPHPとSSHの両方で、私は、PHPがnumpyがインストールされているPythonパスの環境変数がないと判断することができました。この場合、PHPスクリプトの先頭に

putenv('PYTHONPATH=/home8/venicetw/.local/lib/python2.4/site-packages:/home8/venicetw/.local/lib/python/site-packages:'); 

を追加すると、すべて正常に動作します。

答えて

5

PHPの戻りステータスが1になると、実行したプロセスでエラーが発生したことを示します。 (0以外の終了ステータス通常はは、Unixスタイルのシステムではエラーを示しますが、いくつかのプログラムが異なります(diffなど)。サブプロセスによって生成されたstderrを調べて、そこに表示されるエラーメッセージを確認してください。

あなたはstderrをこのように表示することができます:

Output from exec('python hello-numpy.py'): 
    <?php echo exec('python hello-numpy.py 2>&1'); ?><br> 

2>&1は、1つのストリームにstderrstdoutを組み合わせるためのシェルに指示します。通常これをやりたくはありませんが、エラーを見やすくすることができます。

更新:エラーはImportError: No module named numpyです。私たちはPythonのパスを調べることができます。あなたのシステムには複数のPythonがインストールされている可能性があります。また、Apacheの環境(ルートディレクトリなど)は、SSHでPythonを実行したときの環境とは異なる可能性があります。両方の環境では、このPythonスクリプトを実行してみてください。

それらのパスの
import sys, os 
for path in sys.path: 
    print path 
print 
print 'Root:', os.readlink('/proc/self/root') # Linux only 

一つはnumpyがインストールされている場所を指している必要があり、そしてあなたは、Apacheで、それを実行すると、おそらくそれが欠落しています。あるいは、おそらくApacheプロセスに別のルートディレクトリがあります。これはPythonプロセスに継承されます。

ソリューション:環境変数がありません。コメントを参照してください。

+0

ああ、これを持っています: "ImportError:numpyという名前のモジュールがありません" Apacheを再起動するだけの問題なのでしょうか? –

+0

同じPythonバージョンにアクセスしていることを確認してください。 –

+0

ちょうどチェックしました - 彼らは両方ともPython 2.4.3にアクセスしています。共有ホスティング環境では、Apacheを再起動することは選択肢にはなりません。 –

関連する問題