2012年8月26日 星期日

解決 The _imaging C module is not installed

 

為了搞這個,花了我半天的時間來研究...

在專案中,有一個功能會利用到 PIL 來做縮圖,而 Server 總是回應我

The _imaging C module is not installed

 

但是在 runserver 環境下,都沒有此問題,找了半天,原來是因為官方的 PILmod_wsgi 並不相容。(似乎編譯時連結的函式庫不同,所以無法共用?)

 

最後其實只要把官方的 PIL 移除,改裝這個非官方的 PIL 就可以運作了…

http://www.lfd.uci.edu/~gohlke/pythonlibs/

 

Reference


與本文無關的抱怨

會研究這麼久,是想說應急把 runserver 註冊到 windows service 裡面,結果

  • 要嘛無法進行 Log (使用 os.system 指令)
  • 要嘛無法中斷 (使用 subprocess.Popen 指令)

其實花最多時間研究的,是 subprocess.Popen 如何在 windows 環境下把子程序中斷掉...無法中斷當然也就無法採用這個 solution

以下是程式碼,如果有大德知道如何中斷,麻煩分享分享...


import os
import sys

import win32serviceutil

import subprocess
import time

class service(win32serviceutil.ServiceFramework):
_svc_name_ = 'Django'
_svc_display_name_ = 'Django'
_svc_description_ = 'Django'

def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.isAlive = True

def SvcStop(self):
self.isAlive = False

def SvcDoRun(self):
self.timeout = 1000

timestamp = time.localtime()
now = time.strftime("%Y%m%d%H%M%S", timestamp)

outpath = 'C:/AppServ/www/demo/' + now + 'stdout.txt'
errpath = 'C:/AppServ/www/demo/' + now + 'stderr.txt'

with open(outpath, 'wb', 0) as out:
with open(errpath, 'wb', 0) as err:
sub = subprocess.Popen('python C:/AppServ/www/demo/manage.py runserver 0.0.0.0:800', stdout=out, stderr=err)

while True:
if not self.isAlive:
# kill sub here
break

if __name__ == '__main__':
win32serviceutil.HandleCommandLine(service)

沒有留言:

張貼留言