Python のエッグ キャッシュ (PYTHON_EGG_CACHE) とは何ですか?
-
25-09-2019 - |
質問
開発マシンで Python 2.6.1 から 2.6.4 にアップグレードしたところ、Python スクリプトを開始すると次のメッセージが表示されました。
ファイルをeggキャッシュに抽出できません
次のエラーが発生しました。 ファイルを Pythonの卵キャッシュ:
[エラー番号 13] 権限が拒否されました:'/var/www/.python-eggs'
Python の egg キャッシュディレクトリは 現在、次の値に設定されています。
/var/www/.python-eggs
おそらくあなたのアカウントには このディレクトリへの書き込みアクセス権あなたが キャッシュディレクトリは、次の方法で変更できます。 PYTHON_EGG_CACHEの設定 環境変数を アクセス可能なディレクトリにあります。
中には何も入っていない Pythonドキュメント そのため、このディレクトリをどこに置き、何に使用するかについてのベストプラクティスについて少し迷っています。
誰か Python のエッグキャッシュとは何なのか説明してもらえますか?
また、それがなぜ/どのように異なるのか説明できますか? site-packages
Pythonが卵を保存するために使用するディレクトリ(私が理解しているように)?
解決
私の調査によると、一部の Egg は zip ファイルとしてパッケージ化されており、Python のファイルにそのまま保存されていることがわかりました。 site-packages
ディレクトリ。
これらの zip 圧縮された卵は、実行する前に解凍する必要があるため、 PYTHON_EGG_CACHE
デフォルトのディレクトリは ~/.python-eggs
(ユーザーのホーム ディレクトリにあります)。これが存在しない場合、アプリケーションを実行しようとするときに問題が発生します。
いくつかの修正があります。
- を作成します
.python-eggs
ユーザーのホーム ディレクトリにディレクトリを作成し、ユーザーが書き込み可能にします。 - 解凍用のグローバルディレクトリを作成します(例:
/tmp/python-eggs
) 環境変数を設定しますPYTHON_EGG_CACHE
このディレクトリに。 - 使用
-Z
使用時に切り替えるeasy_install
インストール時にパッケージを解凍します。
他のヒント
はPythonの卵のキャッシュは単に卵の仕様に準拠して設置店舗パッケージにsetuptoolsのが使用するディレクトリです。あなたはここをもっとsetuptoolsのについて読むことができます。
また、エラーメッセージの状態として、あなたはPYTHON_EGG_CACHE = /いくつか/その他/ dirをを設定することにより、ご使用の環境内の異なる卵のキャッシュディレクトリを指定することができます。これを行う最も簡単な方法は、それを設定することで、あなたの〜/ .bash_profileをこのように、(もしbashを使っていると仮定した場合):
export PYTHON_EGG_CACHE=/some/other/dir
あなたは、Webアプリケーションを使用している場合は、Apacheの環境でそれを設定する必要があります。
これは、優れた卵メカニズムを使用することによる暗い副作用です。
Egg は 1 つにまとめられたパッケージ (ファイルでいっぱいのディレクトリ) です。 .egg
ファイルを使用してデポリメントを簡素化します。
保存されているのは、 /site-packages/
監督。
Egg に保存されているファイルが存在する限り、 .py
ファイルを作成するとうまく機能します。Python インポートでは、通常のファイルと同じように、任意のファイルのようなオブジェクトからインポートできます。
しかし、次のようなとき .so
たまたまそこにドロップした場合、Python は物理名を持たないライブラリをロードしたいことを基礎となる OS に説明できません。そして、distutils の作成者が考えた唯一の回避策は、それを一時ディレクトリに解凍することです。当然そうではありません /site-packages/
以来 /site-packages/
一般ユーザーは書き込みできません。
したがって、次のいずれかを行うことができます
セット
PYTHON_EGG_DIR
に/tmp
, またはユーザーに与える
www
への書き込み許可/var/www/.python-eggs
(/tmp がクリーンアップされるたびにファイルが解凍されないようにするため) あるいはそれより良い@shalley303 が提案したように卵を解凍します。
(実行時に卵を解凍することは完全に避けてください)。
Pythonの卵は、Pythonモジュールとメタデータの両方を含むzip圧縮パッケージです。卵キャッシュは卵の抽出されたコンテンツは、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