แยก python environment: Pylons + virtualenv + mod_wsgi

ในเครื่องแม่ข่ายเครื่องหนึ่งอาจจะเป็นไปได้ว่ามีคนใช้ Pylons, Django, Turbogears แถมยังอาจจะใช้ package ของ Python ที่แตกต่างๆ กัน. ถ้าลงทุก package ที่ทุกคนต้องการไว้ในส่วนกลางหมดก็เป็นไปได้ว่าอาจจะมีบาง package ขัดแย้งกัน โดยเฉพาะโปรแกรมเดียวกันที่ต่าง version กัน. มากไปกว่านั้นก็อาจจะต้องกวนให้ sys admin ช่วย install ให้บ่อยๆ ด้วย หรือจะให้ทุกคนลง package ในส่วนกลางได้เองหมด ก็อาจจะกระทบกับเสถียรภาพโดยรวมของระบบ. อย่ากระนั้นเลยใช้ virtualenv มาแยก Python environment ของแต่ละคนเลยดีกว่า.

ผมก็เลยลองลง virtualenv ใช้กับ Apache + mod_wsgi + mod_userdir บน Ubuntu 8.04 บนเครื่องส่วนตัวของผมเองดู. ใน entry นี้ผมสมมุติว่าใช้ Apache + mod_wsgi + mod_userdir ได้อยู่แล้วนะครับ (และ มี setuptools ไว้แล้ว) แต่ถ้าสนใจเรื่องการติดตั้งระบบที่ใช้ mod_wsgi ผมก็เขียนเก็บไว้บ้างเหมือนกันที http://blog.vee-u.com/tag/mod_wsgi/

ลง virtualenv ง่ายมากเพียงสั่ง

$ sudo easy_install virtualenv

ก็เสร็จแล้ว

จากนั้นก็สร้าง directory ไว้ลง package ส่วนตัว โดยสั่ง

$ mkdir $HOME/pyenv

จากนั้นก็เข้าไปจัดการสร้าง enviroment โดย

$ cd $HOME/pyenv
$ virtualenv –no-site-packages BASELINE

แล้วก็สร้าง environment สำหรับลง Pylons
$ virtualenv –no-site-packages PYLONS-1

ก่อนลง Pylons ก็ activate environment นั้นก่อน
$ source PYLONS-1/bin/activate

พอ activate แล้ว prompt จะเปลี่นนเป็น (PYLONS-1)$

จากนั้นก็ลง Pylons 0.9.7 (รุ่นทดลอง), SQLAlchemy 0.4.8 และ PasteDeploy (ไม่ต้อง sudo ด้วย)
(PYLONS-1)$ easy install pylons==0.9.7rc2
(PYLONS-1)$ easy install sqlalchemy==0.4.8
(PYLONS-1)$ easy install PasteDeploy

แล้วก็ไฟล์สำหรับเรียก Pylons จาก wsgi ประมาณนี้

APP_CONFIG = "/home/veer/Develop/pylons/ex1/production.ini"
import os
os.environ['PYTHON_EGG_CACHE'] = "/home/veer/egg"
import sys

# บอกให้ python ไปหา package ที่ที่เราเตรียมไว้
sys.path = []
sys.path.append("/home/veer/pyenv/BASELINE/lib/python2.5/site-packages")
sys.path.append("/home/veer/pyenv/PYLONS-1/lib/python2.5/site-packages")
sys.path.append("/home/veer/Develop/pylons/ex1")

from paste.deploy import loadapp
application = loadapp("config:" + APP_CONFIG)

อะไรที่เขียน /home/veer ต่างๆ นี้คือสิ่งที่ใช้ในเครื่องผม เครื่องอื่นๆ ก็คงใช้ต่างๆ กันไป

เท่านี้เว็บของแต่ละคนก็มี environment ของตัวเองแล้ว อย่างในกรณีนี้ package ต่างๆ ก็มาอยู่ใน $HOME ของแต่ละ user แทนที่จะไปอยู่รวมๆ กันใน /usr/lib ผู้ใช้แต่ละคนก็แก้ได้ สะดวกสบาย

อ้างอิง http://code.google.com/p/modwsgi/wiki/VirtualEnvironments

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s