I have Zope and Activestate Python installed together in the same win-xp machine. Everything works fine until I've learned that I can put "sys.setdefaultencoding('cp874')" into sitecustomize.py to accomodate my native language coding. Since I do that, my Zope 2.7.0 service can no longer start. I can start it manually from "runzope.bat", but it never start through the windows system service. A full day investigation reveal that the trouble cause by the missing of the '<SOFTWARE_HOME>\lib\python' in the system environment's "PYTHONPATH". The "runzope.bat" set that up before then execution of "Zope.Startup.run.py", hence it run fine. But "zopeservice.py" rely on the "<SOFTWARE_HOME>\bin\Lib\site-packages\sitecustomize.py" to set up the correct "PYTHONPATH". Here is the code inside Zope's sitecustomize.py

""" Add Zope packages in Windows binary distro to sys.path automagically """
import sys
import os
   sp = __file__
   sp = None
if sp:
   dn = os.path.dirname
   swhome = os.path.join(dn(dn(dn(dn(sp)))), 'lib', 'python')
   if os.path.exists(swhome):
       sys.path.insert(0, swhome)

Unluckily, this sitecustomize.py is now masked with my sitecustomize.py inside Activestate's site-package directory, which actually get loaded by Zope via the Python registry load path (HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.3\PythonPath) instead of the expected one.

I don't think setting up PYTHONPATH inside sitecustomize.py is a good idea. Better keep this mechanism for site specific problems. I'd rather insert a line into zopeservice.py like this.

import os.path
from os.path import dirname as dn
import sys

# these are replacements from mkzopeinstance
PYTHONW = r'C:\Zope-2.7.0\bin\pythonw.exe'
ZOPE_HOME = r'C:\Zope-2.7.0'

ZOPE_RUN = r'%s\Zope\Startup\run.py' % SOFTWARE_HOME
CONFIG_FILE= os.path.join(INSTANCE_HOME, 'etc', 'zope.conf')
PYTHONSERVICE_EXE=r'%s\bin\PythonService.exe' % ZOPE_HOME

sys.path.insert(0, SOFTWARE_HOME)
os.environ['PYTHONPATH'] = SOFTWARE_HOME  <---------------- inserted line

from nt_svcutils.service import Service

servicename = 'Zope_%s' % str(hash(INSTANCE_HOME))

class InstanceService(Service):
   start_cmd = '"%s" "%s" -C "%s"' % (PYTHONW, ZOPE_RUN, CONFIG_FILE)
   _svc_name_ = servicename
   _svc_display_name_ = 'Zope instance at %s' % INSTANCE_HOME
   _exe_name_ = PYTHONSERVICE_EXE

if __name__ == '__main__':
   import win32serviceutil

This is much more palatable in my opinion.

Zope-Dev maillist - [EMAIL PROTECTED]
** No cross posts or HTML encoding! **
(Related lists - http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )

Reply via email to