您好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
以下是我完成的步骤摘要:
在子域根目录: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()
尝试访问域后,出现以下错误:
python3.4:加载共享库时出错:libpython3.4m.so.1.0:无法打开共享对象文件:没有这样的文件或目录
但请注意,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
如果有人能告诉我为什么会发生这种情况会让我很开心:)谢谢!
答案 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.py
,minimal示例在详细安装下运行:
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