開発マシンでPython 2.6.1から2.6.4にアップグレードしたところ、pythonスクリプトの開始時に次のメッセージが表示されました。
ファイルをEggキャッシュに抽出できません
ファイルをPython Eggキャッシュに抽出しようとしたときに次のエラーが発生しました:
[Errno 13]許可が拒否されました: '/var/www/.python-eggs'
Python Eggキャッシュディレクトリは現在次のように設定されています。
/var/www/.python-eggs
アカウントにこのディレクトリへの書き込みアクセス権がない可能性がありますか?キャッシュディレクトリを変更するには、PYTHON_Egg_CACHE環境変数をアクセス可能なディレクトリを指すように設定します。
python docs には何もありませんので、このディレクトリを配置する場所とその用途についてのベストプラクティスに関しては、少しばかり困っています。
誰かがPython Eggキャッシュとは何か説明できますか?
また、site-packages
ディレクトリPythonが卵を保存するために使用するのとはなぜ/どう違うのか説明できますか(わかりました)。
私の調査から、いくつかの卵はZipファイルとしてパッケージ化され、Pythonのsite-packages
ディレクトリ。
これらの圧縮された卵は、実行する前に圧縮解除する必要があるため、PYTHON_Egg_CACHE
ディレクトリはデフォルトでは~/.python-eggs
(ユーザーのホームディレクトリにあります)。これが存在しない場合、アプリケーションを実行しようとしたときに問題が発生します。
いくつかの修正があります。
.python-eggs
ディレクトリをユーザーのホームディレクトリに配置し、ユーザーが書き込みできるようにします。/tmp/python-eggs
)および環境変数PYTHON_Egg_CACHE
このディレクトリに。-Z
使用時の切り替えeasy_install
インストール時にパッケージを解凍します。python Eggキャッシュは、 Egg仕様 に準拠するインストール済みパッケージを保存するためにsetuptoolsが使用する単なるディレクトリです。 セットアップツールの詳細はこちら をご覧ください。
さらに、エラーメッセージに示されているように、PYTHON_Egg_CACHE =/some/other/dirを設定して、環境内の別のEggキャッシュディレクトリを指定できます。これを行う最も簡単な方法は、次のように〜/ .bash_profileに設定することです(bashを使用している場合)。
export PYTHON_Egg_CACHE=/some/other/dir
Webアプリケーションを使用している場合は、Apache環境で設定する必要があります。
これは、別の方法でニースの卵のメカニズムを使用した場合の暗い副作用です。
卵は、脱ポリ化を簡素化するために1つの.Egg
ファイルにパックされたパッケージ(ファイルでいっぱいのディレクトリ)です。
それらは/site-packages/
dirに保存されます。
Eggに保存されているファイルが.py
ファイルである限り、うまく機能します。 Python importは、通常のファイルと同様に、ファイルのようなオブジェクトから物をインポートできます。
しかし、.so
のようなものがそこにドロップした場合、pythonは、物理名を持たないライブラリをロードしたいという基本OSに説明できません。回避策distutilsの作成者は、それを一時ディレクトリに解凍すると考えていますが、当然、/site-packages/
は一般ユーザーには書き込みできないため、/site-packages/
ではありません。
だからあなたはどちらか
PYTHON_Egg_DIR
を/tmp
に設定、または
ユーザーwww
に/var/www/.python-eggs
への書き込み許可を与えます
(/ tmpがクリーンアップされるたびにファイルが解凍されないようにするため)またはより良い
@ shalley303の提案に従って卵を解凍します
(およびランタイムでの卵の解凍を完全に回避します)。
Pythonのエッグは、Pythonモジュールとメタデータの両方を含むZip圧縮パッケージです。Eggキャッシュは、Python内部に含まれるモジュールは使用可能です。
また、インストール後に.Eggの使用を無効にすることもできます。 site-packagesディレクトリに移動して、.Eggを抽出し、それを隠しファイルに移動する(または削除するなど)必要があります。
pythonスクリプトがZabbixから実行されているときにこのエラーを引き起こしていたMySQLdbモジュールの.Eggファイルを無効にするために私がしたことの例を次に示します。
cd /usr/local/lib/python2.7/site-packages unzip MySQL_python-1.2.3-py2.7-linux-x86_64.Egg mv MySQL_python-1.2 .3-py2.7-linux-x86_64.Egg .MySQL_python-1.2.3-py2.7-linux-x86_64.Egg
フィリップBオルダムの権利。コードに次の行を追加できます。
import os
os.environ['PYTHON_Egg_CACHE'] = '/tmp' # a writable directory
簡単な修正方法は、ディレクトリを作成してwww-data
それへのアクセス。
$ mkdir /var/www/.python-eggs
$ chown www-data:www-data /var/www/.python-eggs