开发者

Trouble using PIL with Google Appengine SDK

I have a Windows Server 2008 R2 (64bits) machine on which I wanted to develop a google AppEngine app.

So I installed Python 2.5.4 from python.org (because the Google SDK said I needed 2.5 and 2.5.6 didn't have any MSI's) Then I installed PIL from http://www.pythonware.com/products/pil/ I used version 1.1.7 for python 2.5 I used the 32-bits versions of both of these.

Then I installed the AppEngine SDK.

Hello-World worked fine, but I wanted to manipulate an image, which didn't work because I get this stacktrace and a HTTP 500 response:

2010-02-18 11:50:27 Running command: "['C:\\Python25\\pythonw.exe', 'C:\\Program Files 

(x86)\\Google\\google_appengine\\dev_appserver.py', '--admin_console_server=', '--port=8080', 'd:\\imgsvc']"
WARNING  2010-02-18 10:50:29,260 datastore_file_stub.py:623] Could not read datastore data from c:\users\admini~1\appdata\local\temp\dev_appserver.datastore
INFO     2010-02-18 10:50:29,627 dev_appserver_main.py:399] Running application imgsvc on port 8080: http://localhost:8080
ERROR    2010-02-18 10:50:40,058 dev_appserver.py:3217] Exception encountered handling request
Traceback (most recent call last):
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3180, in _HandleRequest
    self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
  File "C:\Program开发者_运维技巧 Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3123, in _Dispatch
    base_env_dict=env_dict)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 515, in Dispatch
    base_env_dict=base_env_dict)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2382, in Dispatch
    self._module_dict)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2292, in ExecuteCGI
    reset_modules = exec_script(handler_path, cgi_path, hook)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2188, in ExecuteOrImportScript
    exec module_code in script_module.__dict__
  File "d:\imgsvc\imgsvc.py", line 7, in <module>
    outputimage = images.resize(inputimage.content, 32, 32)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\images\__init__.py", line 625, in resize
    return image.execute_transforms(output_encoding=output_encoding)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\images\__init__.py", line 513, in execute_transforms
    response)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\apiproxy_stub_map.py", line 78, in MakeSyncCall
    return apiproxy.MakeSyncCall(service, call, request, response)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\apiproxy_stub_map.py", line 278, in MakeSyncCall
    rpc.CheckSuccess()
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\apiproxy_rpc.py", line 149, in _WaitImpl
    self.request, self.response)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\apiproxy_stub.py", line 80, in MakeSyncCall
    method(request, response)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\images\images_stub.py", line 171, in _Dynamic_Transform
    response_value = self._EncodeImage(new_image, request.output())
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\images\images_stub.py", line 193, in _EncodeImage
    image.save(image_string, image_encoding)
  File "C:\Python25\lib\site-packages\PIL\Image.py", line 1439, in save
    save_handler(self, fp, filename)
  File "C:\Python25\lib\site-packages\PIL\PngImagePlugin.py", line 564, in _save
    import ICCProfile
SystemError: Parent module 'PIL' not loaded
INFO     2010-02-18 10:50:40,081 dev_appserver.py:3246] "GET / HTTP/1.1" 500 -

The python script I was trying to run:

from google.appengine.api import urlfetch
from google.appengine.api import images

url = "http://www.brokenwire.net/bw/images/113.png"
inputimage = urlfetch.fetch(url)
if inputimage.status_code == 200:
    outputimage = images.resize(inputimage.content, 32, 32)
    self.response.headers['Content-Type'] = "image/png"
        self.response.out.write(outputimage)

Anybody any idea what is going wrong here?

I also tried this standalone python script, which works fine:

import Image
im = Image.open('filename.png')
im2 = im.resize((100,100), Image.ANTIALIAS)
im2.show()

It seems that it makes a difference which image I use:

url = "http://www.r-stone.net/blogs/ishikawa/uploaded_images/google_appengine-779483.png"

Gives the stacktrace of the question, but

url = "http://www.brokenwire.net/bw/images/113.png"

works without a problem.


This happens when Python can't find ICCProfile module. Apperently when using trough GAE instead of an ImportError the importer throws a SystemError, and the function fails. What i did was to change line 567 in ...\Python25\Lib\site-packages\PIL\PngImagePlugin.py from

except ImportError:

to:

except Exception:


I had the exact same issue on my Windows machine (on MacOS it works) so i uninstalled the PIL 1.1.7 and installed the previous 1.1.6 version and now it works like charm ;).

Here is the source for this hack: http://www.chris-wong.net/parent-module-pil-not-loaded/


I guess the PIL is not supported in App Engine. There are currently 629 persons that have flagged this issue to ask for the Python Image Library (PIL) (it's the fifth most starred issue for App Engine) and I can only encourage you to flag this issue too.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜