1

py2app にエクスポートしようとしている python プログラム (python 2.7.3、X11 Tkinter、py2app 0.6.4、MacOS X 10.7.4) に問題があります。この問題は、スタンドアロンの py2app 化されたアプリ バージョンのプログラムでのみ発生し始めました。アプリが作成されたpythonソースファイルを実行すると、問題は存在しないため、py2appエクスポートと関係があるに違いないと感じています。

問題: GUI を起動したときに、有効なイメージ ファイルを初めてロードしようとすると、イメージのロードに失敗し、PIL イメージ モジュールから次のエラーが表示されます。

File "Image.pyc", line 1980, in open
IOError: cannot identify image file

次に(GUIなどを閉じずに)まったく同じファイルを開こうとすると、エラーや問題はなく、完全に読み込まれます。これは、私が試した画像ファイルで毎回発生します。最初の読み込み試行は失敗し、その後の試行は成功します。その最初のエラーの後、最初のファイルとは異なる場合でも、画像ファイルの読み込みに失敗することはありません。

いくつかの注意事項: - 画像ファイルはシーケンスであり、非常に大きい (約 300 MB) ため、読み込みプロセスを高速化するために、mmap を使用します。mmap ステップを削除して、通常のファイル オブジェクトを ImagePIL.open に直接渡そうとしましたが、問題は影響を受けません。
- ImagePIL.open に渡す前に、ファイルの先頭までシークしようとしましたが、効果がありませんでした。- py2app セットアップ ファイルはごく普通のものです。いくつかの構成ファイルとアイコンが含まれているだけです。

問題のある画像読み込み関数の関連部分は次のとおりです。

import Image as ImagePIL
import mmap as m
...
...
def loadImage(self):
    errorLog.debug("Attempting to open image \""+self.filenameVar.get()+"\"")
    try:
        if self.fileMap is not None:
            self.fileMap.close()
        imageFile = open(self.filenameVar.get(), 'r')
        self.fileMap = m.mmap(imageFile.fileno(), 0, prot=m.PROT_READ)
#       self.fileMap.seek(0)
        self.imageSeries = ImagePIL.open(self.fileMap)
        imageFile.close()
    except(IOError):
        errorLog.exception("Failed to open image \""+self.filenameVar.get()+"\"")
        return

私はかなり困惑しています - 何かアイデアはありますか? 前もって感謝します!

編集: Tkinter、PIL、および py2app が MacPorts 2.1.2 を使用してインストールされたことを追加する必要があります。

4

2 に答える 2

1

py2app レシピの 1 つが含まれていることを確認しようとしても、py2app は PIL のイメージ プラグインをアプリケーション バンドルに含めていないようです。

「python setup.py py2app --packages=PIL」でビルドし、「import PIL.Image as ImagePIL」を使用して使用することもできます。

PIL レシピが機能しない理由はまだわかりません。MacPorts が python パッケージをビルドする方法に問題がある可能性があります (私自身は MacPorts を使用していません)。

于 2013-02-20T08:59:14.570 に答える
0

この問題は、Pillow バージョン 3.0.0 と py2app の間の不一致の結果です。

PIL(Pillow)を回避するための2つの解決策を提案します

  1. PIL の代わりに opencv を使用します。
  2. 現在のバージョンの Pillow をアンインストールし、1.7.8 などの以前のバージョンをインストールします
于 2015-10-05T20:31:40.450 に答える