Update new Django and Python 2.7.* with virtualenv on Dreamhost (with passenger)

前端 未结 2 1059
我寻月下人不归
我寻月下人不归 2020-12-07 11:34

Dreamhost is a great host for small project. And it\'s also Django friendly hosting. Everything good except python and Django version is a little bit out of date. Well it\'s

相关标签:
2条回答
  • 2020-12-07 12:17

    I currently have private server, a shell account and a bit of luck. So here is what I do:

    1. SSH to your host to upgrade python

       cd ~
       mkdir tmp
       cd tmp
       wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz
       tar zxvf Python-2.7.3.tgz
       cd Python-2.7.3
       ./configure --enable-shared --prefix=$HOME/Python27 --enable-unicode=ucs4
       make
       make install
      
    2. Configure system to use our new Python. Open ~/.bashrc and add the following line

       export PATH="$HOME/Python27/bin:$PATH"
       export LD_LIBRARY_PATH=$HOME/Python27/lib
      
       #save it and run
       source ~/.bashrc
      

      you can now check your python version with which python

    3. Install easy_install, pip

      cd ~/tmp
      wget http://peak.telecommunity.com/dist/ez_setup.py
      python ez_setup.py
      easy_install pip
      # Or even shorter
      wget https://bootstrap.pypa.io/get-pip.py
      python get-pip.py
      
    4. Install virtualenv

       pip install virtualenv
       virtualenv $HOME/<site>/env
       #Switch to virtualenv
       source $HOME/<site>/env/bin/activate
      

      you can also add env path to bashrc

       export PATH="$HOME/<site>/env/bin/:$PATH"
       source ~/.bashrc
      
    5. Install django and everything else

       pip install django
       pip install ....
       pip install ....
       pip install ....
      
    6. Create project

       cd $HOME/<site>/
       python $HOME/<site>/env/bin/django-admin.py startproject project
      
    7. Create passenger_wsgi.py in HOME/<site>/ with following content

       import sys, os
       cwd = os.getcwd()
       sys.path.append(cwd)
       sys.path.append(cwd + '/project')  #You must add your project here or 500
      
       #Switch to new python
       #You may try to replace $HOME with your actual path
       if sys.version < "2.7.3": os.execl("$HOME/<site>/env/bin/python",
           "python2.7.3", *sys.argv)
      
       sys.path.insert(0,'$HOME/<site>/env/bin')
       sys.path.insert(0,'$HOME/<site>/env/lib/python2.7/site-packages/django')
       sys.path.insert(0,'$HOME/<site>/env/lib/python2.7/site-packages')
      
       os.environ['DJANGO_SETTINGS_MODULE'] = "project.settings"
       import django.core.handlers.wsgi
       application = django.core.handlers.wsgi.WSGIHandler()
      

    or this way

    import sys, os
    
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    
    sys.path.append(os.path.join(BASE_DIR))  #You must add your project here or 500
    
    #Switch to new python
    #You may try to replace $HOME with your actual path
    PYTHON_PATH = os.path.join(BASE_DIR, 'env', 'bin', 'python')
    if sys.executable != PYTHON_PATH:
        os.execl(PYTHON_PATH, "python2.7.12", *sys.argv)
    

    If you are using django 1.7, replace the last two line with

    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()
    
    1. Enjoy :D

    New version of python on Dreamhost will no longer return sys.executable so you this is my version of passenger_wsgi

    import sys, os
    
    VIRTUAL_ENV_PYTHON = 'venv-python'  # Python > 2.7.6 dreamhost not return sys.executable
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    
    def is_venv_python():
        if len(sys.argv) > 0:
            last_item = sys.argv[len(sys.argv)-1]
            if last_item == VIRTUAL_ENV_PYTHON:
                return True
        return False
    
    sys.path.append(os.path.join(BASE_DIR))  #You must add your project here or 500
    
    #Switch to new python
    
    PYTHON_PATH = os.path.join(BASE_DIR, 'env', 'bin', 'python')
    if not is_venv_python():
        os.execl(PYTHON_PATH, "python2.7.12", *sys.argv + [VIRTUAL_ENV_PYTHON])
    
    sys.path.insert(0, os.path.join(BASE_DIR, 'env', 'bin'))
    sys.path.insert(0, os.path.join(
        BASE_DIR, 'env', 'lib', 'python2.7', 'site-packages'
    ))
    
    0 讨论(0)
  • 2020-12-07 12:23

    Currently Dreamhost updated servers to Ubuntu 12.04, and i've got an error:

    Import Error: <path-to-python>/_io.so undefined symbol: PyUnicodeUCS2_Decode
    

    after compiling custom python and running "python ez_setup.py"

    The solution was to compile python with --enable-unicode=ucs4 at step 1

    ./configure --enable-shared --prefix=$HOME/Python27 --enable-unicode=ucs4
    
    0 讨论(0)
提交回复
热议问题