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.
精彩评论