この質問とその回答に同意します。卵のパスを追加したところ、うまくいきました。ただし、Python をインタラクティブに実行して flup をインポートすると、問題や追加のパス指定なしで動作します。違いはどこですか?
編集: fastcgi を実行している間、.pth ファイルは解析されないようですが、これは単なる推測です。もっと正式な声明が必要です。
この質問とその回答に同意します。卵のパスを追加したところ、うまくいきました。ただし、Python をインタラクティブに実行して flup をインポートすると、問題や追加のパス指定なしで動作します。違いはどこですか?
編集: fastcgi を実行している間、.pth ファイルは解析されないようですが、これは単なる推測です。もっと正式な声明が必要です。
もう少し徹底的に分析した結果、ここで何が起こっているのか理解できたと思います。
Python が起動すると、sys.path が設定されます (すべてインタープリターの初期化の一部として)。
この時点で、環境を使用して .pth ファイルの場所が決定されます。この時点で PYTHONPATH が定義されていない場合、sys.prefix にインストールされているモジュールが見つかりません。さらに、easy-install.pth はおそらくカスタム プレフィックス ディレクトリにインストールされているため、解析対象の .pth ファイルが見つかりません。
インタープリターが初期化された後に環境変数を os.environ または sys.path に追加しても、.pth ファイルが再度解析されることはありません。これが、Python が自然に行うことを期待することを手動で行うことを余儀なくされていることに気付く理由です。
正しい解決策は、インタープリターの起動時 (mysite.fcgi が実行される前) に Python インタープリターがカスタム パスを使用できるようにすることだと思います。
PYTHONPATH 環境変数を mod_fastcgi に追加するオプションを探しましたが、そのようなオプションはありません。おそらく、これは一般的な Apache オプションであるため、mod_fastcgi に記載されていないか、mod_fastcgi 構成で静的変数を設定できない可能性があります。
それを考えると、次の回避策を作成できると思います。
テストに適した環境はありませんが、ラッパー シェル スクリプトは次のようになると思います。
#!/bin/sh
export PYTHONPATH=/your/local/python/path
/path/to/python /path/to/your/fastcgi/handler # this line should be similar to what was supplied to mod_fastcgi originally
考慮すべき別の回避策がある場合があります。
PYTHONPATH環境変数が定義されていても、PythonがFastCGI環境で起動したときに.pthファイルが解釈されないことに同意します。なぜそうなるのかはわかりませんが、回避策の提案はあります。
site.addsitedirを使用します。.pthファイルを解釈するため、各ファイルにフルパスを追加しなくても、名前だけで卵をインポートできます。
#!/user/bin/python2.6
import site
# adds a directory to sys.path and processes its .pth files
site.addsitedir('/home/mhanney/.local/lib/python2.6/site-packages/')
# avoids permissions error writing to system egg-cache
os.environ['PYTHON_EGG_CACHE'] = '/home/mhanney/.local/egg-cache'
仮想環境を使用する必要はありません。私の共有ホスティングプロバイダーでは、〜/.localにeggsをインストールするだけです。
python setup.py install --prefix=~/.local
これは、FastCGIのデバッグに役立つ、環境変数、パス、およびモジュールをダンプするためのflupの「HelloWorld」の例のバリエーションです。
#!/usr/bin/python2.6
import sys, os, site, StringIO
from pprint import pprint as p
# adds a directory to sys.path and processes its .pth files
site.addsitedir('/home/mhanney/.local/lib/python2.6/site-packages/')
# avoids permissions error writing to system egg-cache
os.environ['PYTHON_EGG_CACHE'] = '/home/mhanney/.local/egg-cache'
def test_app(environ, start_response):
output = StringIO.StringIO()
output.write("Environment:\n")
for param in os.environ.keys():
output.write("%s %s\n" % (param,os.environ[param]))
output.write("\n\nsys.path:\n")
p(sys.path, output)
output.write("\n\nsys.modules:\n")
p(sys.modules, output)
start_response('200 OK', [('Content-Type', 'text/plain')])
yield output.getvalue()
if __name__ == '__main__':
from flup.server.fcgi import WSGIServer
WSGIServer(test_app).run()
Web サーバーで実行されるプログラムまたは Web サーバーで実行されるコードは、対話的に使用するものと比較して、環境が制限されています。ほとんどの場合、違いはインタラクティブ環境と FastCGI 環境の違いに起因します。私があなたに言えないのは、この文脈でどの違いが重要なのかということです.
IIS (Windows) で Python アプリケーションを実行しているときに、同様の問題が発生しました。setuptools が圧縮された卵のアクセス許可を変更し、ISAPI アプリケーションが制限された特権アカウントで実行されるため、ISAPI で実行している場合、卵が読み取れないことがわかりました。
FastCGI で同じ状況が発生している可能性があります。FastCGI プロセスに、卵を読み取ったり、必要に応じて卵を展開したりする権限がない場合、問題が発生する可能性があります。また、プロセスによって書き込み可能なディレクトリに PYTHON_EGG_CACHE 環境変数を設定することも、一部の卵 (特に、ファイルとしてアクセスする必要があるバイナリ/拡張モジュールまたはリソースを含む卵) に必要であることがわかりました。