75

開発マシンで 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 の卵のキャッシュとは何かを説明できますか?

site-packagesまた、 Pythonが卵を保存するために使用するディレクトリとなぜ/どのように異なるのか説明できますか(私が理解しているように)?

4

9 に答える 9

69

私の調査によると、一部の卵はzipファイルとしてパッケージ化されており、Pythonのsite-packagesディレクトリにそのように保存されています。

これらの圧縮された卵は、実行する前に解凍する必要があるため、PYTHON_EGG_CACHEデフォルトでディレクトリ~/.python-eggs(ユーザーのホームディレクトリにあります)に展開されます。これが存在しない場合、アプリケーションを実行しようとしたときに問題が発生します。

いくつかの修正があります:

  1. .python-eggsユーザーのホームディレクトリにディレクトリを作成し、ユーザーが書き込みできるようにします。
  2. 解凍するためのグローバルディレクトリ(例/tmp/python-eggs)を作成し、環境変数PYTHON_EGG_CACHEをこのディレクトリに設定します。
  3. インストール時にパッケージを解凍するために使用する場合は、-Zスイッチを使用してください。easy_install
于 2010-02-03T17:03:15.030 に答える
30

Python Egg キャッシュは、 egg 仕様に準拠するインストール済みパッケージを格納するために setuptools によって使用される単純なディレクトリです。setuptools の詳細については、こちらをご覧ください。

さらに、エラー メッセージに示されているように、PYTHON_EGG_CACHE=/some/other/dir を設定することで、環境内の別の卵キャッシュ ディレクトリを指定できます。これを行う最も簡単な方法は、次のように ~/.bash_profile (bash を使用していると仮定) に設定することです。

export PYTHON_EGG_CACHE=/some/other/dir

Web アプリケーションを使用している場合は、Apache 環境で設定する必要がある場合があります。

于 2010-02-03T13:56:10.543 に答える
14

これは、そうでなければ優れた卵メカニズムを使用することの暗い副作用です。

Egg はパッケージ (ファイルでいっぱいのディレクトリ) であり、.egg展開を簡素化するために 1 つのファイルにパックされます。

それらは/site-packages/dir に保存されます。

卵に保存されているファイルがファイルである限り、.pyうまく機能します。Python import は、ファイルのようなオブジェクトから、通常のファイルと同じようにインポートできます。

しかし.so、そこにたまたま何かが落ちた場合、pythonは、物理名を持たないライブラリをロードしたいことを基礎となるOSに説明できません。そして、distutils の作成者が考えた唯一の回避策は、それを一時ディレクトリに解凍することです。当然、一般ユーザーには書き込みができない/site-packages/ので、そうではありません。/site-packages/

したがって、次のいずれかを行うことができます

  • または_ PYTHON_EGG_DIR_/tmp

  • ユーザーwwwに書き込み権限を与える/var/www/.python-eggs
    ( /tmp がクリーンアップされるたびにファイルが解凍されないようにする)またはそれよりも良い

  • @ shalley303 の提案に従って卵を解凍します
    (実行時に卵を解凍しないでください)。

于 2012-08-14T18:29:31.923 に答える
3

インストール後に .egg の使用を無効にすることもできます。site-packages ディレクトリに移動し、.egg を抽出してから、それを隠しファイルに移動する (または削除するなど) 必要があります。

PythonスクリプトがZabbixから実行されているときにこのエラーを引き起こしていたMySQLdbモジュールの.eggファイルを無効にするために私が行ったことの例を次に示します。

cd /usr/local/lib/python2.7/site-packages
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
于 2012-04-04T19:53:39.487 に答える
3

Python の卵は、Python モジュールとメタデータの両方を含む zip 圧縮されたパッケージです。Egg キャッシュは、内部に含まれる Python モジュールを使用できるように、egg の抽出されたコンテンツが格納される場所です。

于 2010-02-03T14:15:17.190 に答える