為了搞這個,花了我半天的時間來研究...
在專案中,有一個功能會利用到 PIL 來做縮圖,而 Server 總是回應我
The _imaging C module is not installed
但是在 runserver 環境下,都沒有此問題,找了半天,原來是因為官方的 PIL 與 mod_wsgi 並不相容。(似乎編譯時連結的函式庫不同,所以無法共用?)
最後其實只要把官方的 PIL 移除,改裝這個非官方的 PIL 就可以運作了…
http://www.lfd.uci.edu/~gohlke/pythonlibs/
Reference
- http://www.zhimaq.com/questions/2096/the-_imaging-c-module-is-not-installed-managepy-runserverapache
- http://stackoverflow.com/questions/4011705/python-the-imagingft-c-module-is-not-installed
與本文無關的抱怨
會研究這麼久,是想說應急把 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)
沒有留言:
張貼留言