【问题标题】:No module named deploy when trying to start pyramid app with mod_wsgi尝试使用 mod_wsgi 启动金字塔应用程序时没有名为 deploy 的模块
【发布时间】:2013-04-16 04:11:43
【问题描述】:

第一次尝试在我的金字塔应用程序中使用 mod_wsgi,但当我尝试访问该站点时,我不断收到 ImportError: No module named deploy

在我的/etc/apache2/sites-available/domain.com

<VirtualHost *:80>  
    ServerName domain.com
    ServerAlias www.domain.com
    ServerAdmin admin@domain.com
    DocumentRoot /data/app
    ErrorLog /data/app/apache_error.log

    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    WSGIDaemonProcess pyramid user=www-data group=www-data \
        processes=2 threads=4 \
        python-path=/data/app/lib/python2.6/site-packages/
    WSGIScriptAlias / /data/app/pyramid.wsgi

    <Directory /data/app>
        WSGIProcessGroup pyramid
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

/data/app/pyramid.wsgi

venv = '/data/app/bin/activate_this.py'
execfile(venv, dict(__file__=venv))

ALLDIRS = ['/data/app/lib/python2.6/site-packages']

import sys, site, os

site.addsitedir('/data/app/lib/python2.6/site-packages')

sys.path.append('/data/app/app')
os.environ['PYTHON_EGG_CACHE'] = '/data/app/python-eggs'

from pyramid.paster import get_app, setup_logging
ini_path = '/data/app/app/development.ini'
setup_logging(ini_path)
application = get_app(ini_path, 'main')

当我尝试在浏览器中访问 domain.com 时,我收到 The server encountered an internal error or misconfiguration and was unable to complete your request 错误。这是我的错误日志的打印结果

[Mon Apr 22 20:43:13 2013] [error] test
[Mon Apr 22 20:43:13 2013] [error] mod_wsgi (pid=6795): Target WSGI script '/data/app/pyramid.wsgi' cannot be loaded as Python module.
[Mon Apr 22 20:43:13 2013] [error] mod_wsgi (pid=6795): Exception occurred processing WSGI script '/data/app/pyramid.wsgi'.
[Mon Apr 22 20:43:13 2013] [error] Traceback (most recent call last):
[Mon Apr 22 20:43:13 2013] [error]   File "/data/app/pyramid.wsgi", line 30, in <module>
[Mon Apr 22 20:43:13 2013] [error]     from pyramid.paster import get_app, setup_logging
[Mon Apr 22 20:43:13 2013] [error]   File "/data/app/lib/python2.6/site-packages/pyramid-1.4-py2.6.egg/pyramid/paster.py", line 3, in <module>
[Mon Apr 22 20:43:13 2013] [error]     from paste.deploy import (
[Mon Apr 22 20:43:13 2013] [error] ImportError: No module named deploy

请注意,第一行的test 打印来自我在/data/app/lib/python2.6/site-packages/pyramid-1.4-py2.6.egg/pyramid/paster.py 顶部手动添加的print 'test',以确保它是从我预期的文件中加载的......

现在如果我从 pserve 启动应用程序

$ /bin/pserve app/development.ini --reload

应用启动成功,控制台日志如下

test
Starting subprocess with file monitor
test
Starting server in PID 9132.
serving on http://0.0.0.0:6543

我也试过直接进入python导入paster.py,也没问题

$ cd /data/app/lib/python2.6/site-packages/pyramid-1.4-py2.6.egg/pyramid/
$ /data/app/bin/python
Python 2.6.5 (r265:79063, Oct  1 2012, 22:04:36)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyramid.paster as p
test
>>> print p.__file__
/data/app/lib/python2.6/site-packages/pyramid-1.4-py2.6.egg/pyramid/paster.pyc
>>>

权限也应该没问题

$ ls /data/app -l
-rw-rw-r-- 1 root www-data 4148 2013-04-22 21:06 apache_error.log
drwxrwsr-x 4 root www-data 4096 2013-04-22 12:05 app
drwxrwsr-x 2 root www-data 4096 2013-04-22 12:04 bin
drwxrwsr-x 2 root www-data 4096 2013-04-22 11:58 include
drwxrwsr-x 3 root www-data 4096 2013-04-22 11:58 lib
-rwxrwxr-x 1 root www-data  893 2013-04-22 12:23 pyramid.wsgi
drwxrwsr-x 2 root www-data 4096 2013-04-22 12:07 python-eggs

我错过了什么?谢谢!

编辑 www-data 也是正确的用户

$ ps aux | grep apache2
root      2599  0.0  1.4 185200 14552 ?        Ss   10:00   0:02 /usr/sbin/apache2 -k start
www-data  9064  0.0  0.8 185664  8940 ?        Sl   21:06   0:00 /usr/sbin/apache2 -k start
www-data  9065  0.0  0.8 185664  8940 ?        Sl   21:06   0:00 /usr/sbin/apache2 -k start
www-data  9095  0.0  1.1 187292 11388 ?        S    21:06   0:00 /usr/sbin/apache2 -k start
www-data  9096  0.0  1.1 187292 11388 ?        S    21:06   0:00 /usr/sbin/apache2 -k start
www-data  9097  0.0  1.0 186768 10472 ?        S    21:06   0:00 /usr/sbin/apache2 -k start
www-data  9098  0.0  1.0 186768 10472 ?        S    21:06   0:00 /usr/sbin/apache2 -k start
www-data  9099  0.0  1.0 186768 10472 ?        S    21:06   0:00 /usr/sbin/apache2 -k start
root      9189  0.0  0.0   7624   912 pts/0    S+   21:42   0:00 grep apache2

编辑根据 Graham 的建议,我将 paste.py 中的 print 'test' 替换为

import paste as p
print p.__path__

通过 apache 访问站点时的打印输出是 /usr/local/lib/python2.6/dist-packages/paste,而不是 virtualenv。我已经添加了所有我可以在网上很好的示例,以指向我在pyramid.wsgi 中的 virtualenv 以及 apache 配置文件中的 pythonpath,但显然我仍然没有做对。我还能在哪里尝试?

【问题讨论】:

  • 尝试将以下内容添加到您的httpd.conf 或您定义&lt;VirtualHost&gt; 的conf 中(但要在VirtualHost 之外进行)WSGIPythonHome /path/to/virtualenv WSGIPythonPath /path/to/virtualenv/lib/python2.6
  • @RedBaron:谢谢!它起作用了,但是还有一个更根本的问题。如果我有多个应用程序(即多个 virtualenv,这就是首先设置虚拟主机的重点)怎么办?我不能多次定义WSGIPythonHomeWSGIPythonPath 对吧?
  • 很高兴为您提供帮助.....当我从一个虚拟环境迁移到另一个虚拟环境时,我自己也遇到了类似的问题。

标签: python apache mod-wsgi pyramid paster


【解决方案1】:

在我的情况下,在虚拟环境中重新安装 PasteDeploy 解决了这个问题,但不知道为什么。

【讨论】:

    【解决方案2】:

    终于解决了。从控制台日志很明显,我在/usr/local/lib 中安装的主要python 安装了一个paste 模块,但没有定义deploy 处理程序。

    RedBaron 设置WSGIPythonHome 的评论有效,但问题是我有多个应用程序,所以我不能只将WSGIPythonHome 全局指向特定应用程序的虚拟环境。

    无论如何,我再次浏览了 virtualenv 上的 mod_wsgi 文档 (https://code.google.com/p/modwsgi/wiki/VirtualEnvironments#Baseline_Environment),发现 WSGIPythonHome 应该指向“处女环境”。字面意思

    $ virtualenv --no-site-packages BASELINE
    

    然后指向WSGIPythonHome

    WSGIPythonHome /usr/local/pythonenv/BASELINE
    

    并将 WSGIDaemonProcess 指向我的应用程序的特定 virtualenv(我在一开始就已经这样做了)

    课程学习:更多地关注文档...


    最后,我的pyramid.wsgi可以大大简化为只有以下

    import os
    os.environ['PYTHON_EGG_CACHE'] = '/data/app/python-eggs'
    
    from pyramid.paster import get_app, setup_logging
    ini_path = '/data/app/app/development.ini'
    setup_logging(ini_path)
    application = get_app(ini_path, 'main')
    

    【讨论】:

      【解决方案3】:

      该错误表明没有安装 PasteDeploy 包。

      【讨论】:

      • 感谢您的回复。如果是这样的话,那如何解释为什么从 pserve 开始加载 same script 是成功的?尽管如此,我尝试了$ bin/pip install pastedploy 并得到了Requirement already satisfied (use --upgrade to upgrade): pastedeploy in ./lib/python2.6/site-packages/PasteDeploy-1.5.0-py2.6.egg Cleaning up...
      • 编写一个导入'paste'并打印出'paste.__file__'的hello world WSGI程序。这是从你期望的地方来的吗?
      • 再次感谢!我用import paste as p print p.__path__ 替换了我的print test。为什么这么简单的检查没有让我逃脱...但实际上apache没有得到正确的paste,打印出来的是'/usr/local/lib/python2.6/dist-packages/paste'我已经添加了所有的例子来指向我在pyramid.wsgi中的virtualenv以及apache 配置文件中的pythonpath...我在哪里做错了?
      猜你喜欢
      • 2015-01-27
      • 2017-07-10
      • 2013-03-03
      • 2016-07-21
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      相关资源
      最近更新 更多