web-dev-qa-db-ja.com

サーバーが使用しているPython実行可能ファイルを見つけるにはどうすればよいですか?

Linuxは初めてです。

Pythonが複数インストールされている(Linux-Apache-mod_wsgi-Django)サーバーを管理しています。このサイトは現在機能していますが、Pythonの実行可能ファイルが実行に使用されているかどうかを確認したいと思います。デフォルトではないことはわかっています。

また、mod_wsgiはどのインストールを使用するかPythonをどのように知るのですか?.wsgiスクリプトにシバン行がありません。

1
Ram Rachum

#! lineは使用されず、通常、mod_wsgiで使用されるWSGIスクリプトファイルに配置されません。

Pythonのどのバージョン/インストールが使用されているかを判断するには、2つの部分があります。

他の誰かが最初に指摘したのは、どのPythonライブラリmod_wsgi.soがリンクされているかを調べることです。ほとんどのUNIXシステムでは、これは「ldd」コマンドを使用して行われます。

ldd mod_wsgi.so

使用されているApacheモジュールディレクトリにインストールされている実際のmod_wsgi.soでこれを実行します。これにより、mod_wsgiのどのバージョンがコンパイルされたかが確実にわかります。

LibpythonX.Y.soファイルへの参照が表示されない場合は、mod_wsgi.soがPythonライブラリに対して静的にリンクされています。これは機能しますが、mod_pythonも同じファイルにロードされていない限り機能します。 Apache、Pythonライブラリの静的リンクを使用すると、mod_wsgiのロード時に実行する必要があるランタイムコードの再配置により、Apacheプロセスが不必要に肥大化するため、これに依存することは非常に悪い考えです。 .so静的にリンクされたPythonライブラリ。

Mod_wsgiで実行しているときの「sys.executable」の値は意味がなく、どのPythonバージョンが使用されたか」を判別する手段として使用できないことに注意してください。これは、コマンドラインPythonは使用されません。代わりに、実行中の実行可能ファイルは実際にはApacheであり、sys.executableがそれを反映する可能性があります。Apacheが実行されてmod_wsgi.soがロードされた後でのみPythonは、埋め込まれたPython APIを使用して初期化されます。同様に、 'which python'を実行しても、Pythonのインストールを正確に判断するのに役立ちません。使用されています。

2番目の部分は、実行時に実際に使用されたPythonのインストールを確認することです。これを行うには、WSGI hello worldプログラムを使用し、それを変更して「sys.prefix」の値をダンプする必要があります。 。これにより、Pythonインストールが配置されているルートディレクトリがわかります。使用されたPython共有ライブラリのバージョンに基づいて、どのバージョンが使用されたかがわかります。そのルートディレクトリの下にある実際の「lib/pythonX.Y」ディレクトリが使用されています。そのルートディレクトリの下に複数のバージョンがインストールされている可能性があるため、バージョンは重要です。

'sys.prefix'で取得するものは、mod_wsgi.soファイルのlibpythonX.Y.so依存関係に基づいている可能性があると考えていたため、実際にはルートディレクトリとは異なる場合があることに注意してください。これは、初期化時にPythonが 'lib'ディレクトリを見つけようとする方法によるものです。

たとえば、Python 2.6を「/ usr/local」の下にインストールし、もう1つを「/ usr」の下にインストールしたが、「/ usr/local」の下にmod_wsgiをコンパイルした場合、 'sys.prefix'が '/ usr'に解決されていることがまだ見つかる場合があります。これは、組み込みシステムではデフォルトでPythonが 'PATH'環境変数の値を調べて検索パスを取得するためです。 'python'実行可能ファイルがプロセスの開始に使用されなかった場合でも、ルートディレクトリを計算するためのベースポイントとしての 'python'実行可能ファイル。

Apacheでは、通常は「root」として開始されるため、「PATH」に「/ usr/local/bin」が含まれているとは限らないため、代わりに「/ usr/bin/python」が見つかり、「/」を使用する可能性があります。 'sys.prefix'のusr '。

使用したいものとは異なるルートディレクトリが見つかるこの後者の種類のシナリオでは、Apache構成でWSGIPythonHomeディレクティブを使用して、「sys.prefix」が自動的に計算されるものをオーバーライドできます。

WSGIPythonHomeを使用して別のバージョンのPythonを参照することはできないことに注意してください。同じメジャー/マイナーバージョンのPythonインストールを含むルートディレクトリを参照する必要があります。別のバージョンを使用する必要がある場合Pythonのバージョンでは、mod_wsgiを再コンパイルして再インストールし、別のバージョンに対してコンパイルする必要があります。コンパイル時に使用されるPythonの実際のバージョン/インストールは、 '-with-を使用して指定できます。ビルド中のmod_wsgi構成スクリプトに対するpython 'オプション。

WSGIPythonHomeディレクティブを使用して、使用されているPythonインストールをオーバーライドする方法は他にもありますが、WSGIPythonHomeを使用することをお勧めします。

5

mod_wsgiは、特定のpythonバージョンに対してリンクされています。

www:~# ls -l /usr/lib/Apache2/modules/mod_wsgi*
lrwxrwxrwx 1 root root     15 2009-07-27 12:35 /usr/lib/Apache2/modules/mod_wsgi.so -> mod_wsgi.so-2.5
-rw-r--r-- 1 root root 129552 2008-08-23 14:06 /usr/lib/Apache2/modules/mod_wsgi.so-2.4
-rw-r--r-- 1 root root 129552 2008-08-23 14:06 /usr/lib/Apache2/modules/mod_wsgi.so-2.5

あるいは、あなたはすることができます

www:~# ldd /usr/lib/Apache2/modules/mod_wsgi.so
    ...
    libpython2.5.so.1.0 => /usr/lib/libpython2.5.so.1.0 (0xb7de0000)
    ...
2
Justin
$ python
Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15) 
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> 
>>> import sys
>>> 
>>> print sys.executable
/usr/bin/python
2
dschulz

どのPython

これは、シェルによって取得されているpythonを示しているはずです。

これをApacheユーザーとして実行して、ユーザーではなく$ PATHを設定することをお勧めします。

0
Alex

Pythonコード内からsys.executableにアクセスして、使用されているインタープリターバイナリを知ることができます。WSGIページをコーディングしてください。

0
Tobu