Dreamhost上的Passenger出现Django / Python错误

时间:2014-12-15 10:02:16

标签: python django passenger

您好Stackoverflow社区,

我最近一直在尝试在dreamhost上设置Django(使用Passenger)并且遇到了我似乎无法解决的问题。

首先,我使用以下指南来学习和设置所有内容:

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

2)http://www.ricksresources.com/2012/07/writing-wsgi-apps-on-dreamhost-shared-hosting/

3)http://wiki.dreamhost.com/Django

以下是我完成的步骤摘要:

  1. 在dreamhost.com上设置子域sub.domain.com
  2. 启用子域的Passenger以利用WSGI
  3. 将Python 3.4安装到我的$ HOME / Python3.4目录中
  4. 安装ez_setup.py以获取点数
  5. 安装virtualenv以便为django项目创建单独的环境
  6. 在$ HOME / sub.domain.com / env /
  7. 中创建了virtualenv
  8. 使用pip
  9. 下载并安装了Django 1.7
  10. 开始了一个名为 djtest
  11. 的djangoproject
  12. 在子域根目录:sub.domain.com中创建了一个passenger_wsgi.py文件,其中包含以下代码:

    
    import sys, os
    cwd = os.getcwd()
    sys.path.append(cwd)
    
    project_location = cwd + "/djtest"
    
    sys.path.insert(0,project_location)
    
    PYTHON_EXE = '/home/USERNAME/DOMAIN/env/bin/python3'
    
    if sys.executable != PYTHON_EXE:
        os.execl(PYTHON_EXE, PYTHON_EXE, *sys.argv)
    
    sys.path.insert(0,'home/USERNAME/DOMAIN/env/bin')
    sys.path.insert(0,'home/USERNAME/DOMAIN/env/lib/python3.4/site-packages/django')
    sys.path.insert(0,'home/USERNAME/DOMAIN/env/lib/python3.4/site-packages')
    
    os.environ['DJANGO_SETTINGS_MODULE'] = "djtest.settings"
    
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()
    

  13. 尝试访问域后,出现以下错误:

    python3.4:加载共享库时出错:libpython3.4m.so.1.0:无法打开共享对象文件:没有这样的文件或目录

    enter image description here

    但请注意,Passenger + Python可以协同工作,因为将以下代码放入passenger_wsgi.py可以在网上正确呈现:

    def application(environ, start_response):
        start_response('200 OK', [('content-type', 'text/html')])
        return ['Hello world!']
    

    我遇到了一些文章,说明这是一个与未正确指定公共库路径和python路径有关的问题,即: LD_LIBRARY_PATH和PYTHONPATH 例如:Python: ImportError: No module named os

    所以我猜我的错误就是这个,以及如何在virtualenv中运行设置时正确指定那些。

    任何帮助都会受到强烈赞赏:)

    谢谢!

    〜Aivoric


    修改

    似乎我找到了一个解决方案......好吧django现在正确启动......但我仍然不知道为什么环境变量不起作用。为什么LD_LIBRARY_PATH不是自己设置而不必将其硬编码到代码中?

    所以我做的是插入一行:

    os.environ['LD_LIBRARY_PATH'] = '/home/USERNAME/Python34/lib'
    

    进入此代码:

    import sys, os
    cwd = os.getcwd()
    sys.path.append(cwd)
    
    project_location = cwd + "/djtest"
    
    sys.path.insert(0,project_location)
    os.environ['LD_LIBRARY_PATH'] = '/home/USERNAME/Python34/lib'
    
    #Switch to new python
    PYTHON_EXE = '/home/USERNAME/DOMAIN/env/bin/python3'
    
    if sys.executable != PYTHON_EXE:
        os.execl(PYTHON_EXE, PYTHON_EXE, *sys.argv)
    
    sys.path.insert(0,'home/USERNAME/DOMAIN/env/bin')
    sys.path.insert(0,'home/USERNAME/DOMAIN/env/lib/python3.4/site-packages/django')
    sys.path.insert(0,'home/USERNAME/DOMAIN/env/lib/python3.4/site-packages')
    
    os.environ['DJANGO_SETTINGS_MODULE'] = "djtest.settings"
    
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()
    

    我认为在使用os.execl但是无法找到共享库时会生成错误:libpython3.4m.so.1.0

    如果有人能告诉我为什么会发生这种情况会让我很开心:)谢谢!

1 个答案:

答案 0 :(得分:0)

我看到你正在安装python口译人员 尝试执行以下操作:

在本地运行您的django项目。我的意思是使用virtualenv安装您需要的所有内容,确保您的项目在本地工作。

然后,仍然在本地运行pip freeze > requirements.txt

转到你的Dreamhost托管,我们假设你有:

/path/to/project/           # Root for tmp/restart and passenger_wsgi.py 
/path/to/project/public     # This is the root of your django project
/path/to/project/public/env # Your virtual env

上传您的requirements.txt文件

执行命令

cd /path/to/project/public

rm -rf env
virtualenv env
source env/bin/activate

which python # make sure your interpreter is in the virtualenv 
pip install -r requirements.txt

<强>乘客

关于passenger_wsgi.pyminimal示例在详细安装下运行:

import myproject.wsgi
application = myproject.wsgi.application

如果上一个示例不起作用,则意味着某些python处理程序未正确安装 使用虚拟环境的python解释器进行所有库安装非常重要。

以防万一,这是我使用的例子。

注意我必须添加一个egg-info文件夹,该文件夹未被其他模块正确定位__imports__

import os
import sys

cwd = os.getcwd()
env_dir = os.path.join(cwd,'public',  'venv')
project_dir = os.path.join(cwd, 'public')    

# Use the python executable from inside our virtualenv
# https://help.dreamhost.com/hc/en-us/articles/215769548
INTERP = os.path.join(env_dir, 'bin', 'python')
if sys.executable != INTERP:
    os.execl(INTERP, INTERP, *sys.argv)

# Add virtualenv packages to the start of the path
sys.path.insert(0, os.path.join(env_dir, 'bin'))
sys.path.insert(0, os.path.join(env_dir, 'lib', 'python2.7', 'site-packages'))
sys.path.insert(0, os.path.join(env_dir, 'lib', 'python2.7', 'site-packages','zope.interface-3.6.0-py2.7.egg-info'))
sys.path.insert(0, os.path.join(env_dir, 'lib', 'python2.7', 'site-packages', 'django'))

# Add brickwatch django project to the *end* of the path
# (so it will be checked last).
sys.path.append(project_dir)

# Set environment variables for django to use
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

<强>重新启动

要重新启动旅客资料,请在名为/path/to/project/tmp的{​​{1}}中添加一个空文件。

每次修改restart.txt时,请运行:
passenger_wsgi.py

它会告诉乘客重新加载更改。

每次修改应用程序时都建议touch /path/to/project/tmp/restart.txt以避免python和加载文件出现问题。

应用程序记录

在此处查看更多版本的pkill python文件:
https://help.dreamhost.com/hc/en-us/articles/215769548-Passenger-and-Python-WSGI