python - WSGI无法导入本地安装的包

标签 python python-3.x mod-wsgi wsgi importerror

我正在通过 WSGI 在 VPS 上设置 Python 3 Flask 应用程序。我使用 virtualenv。当我访问我的域时,出现内部服务错误。检查错误日志,我发现在尝试导入flask_bootstrap时遇到了ImportError:

[Thu Oct 23 12:14:50.984561 2014] [:error] [pid 4930:tid 139674382092032] [client 54.86.72.53:62650] mod_wsgi (pid=4930): Target WSGI script '/var/www/davidystephenson/davidystephenson.wsgi' cannot be loaded as Python module.
[Thu Oct 23 12:14:50.984628 2014] [:error] [pid 4930:tid 139674382092032] [client 54.86.72.53:62650] mod_wsgi (pid=4930): Exception occurred processing WSGI script '/var/www/davidystephenson/davidystephenson.wsgi'.
[Thu Oct 23 12:14:50.984692 2014] [:error] [pid 4930:tid 139674382092032] [client 54.86.72.53:62650] Traceback (most recent call last):
[Thu Oct 23 12:14:50.984730 2014] [:error] [pid 4930:tid 139674382092032] [client 54.86.72.53:62650]   File "/var/www/davidystephenson/davidystephenson.wsgi", line 8, in <module>
[Thu Oct 23 12:14:50.984843 2014] [:error] [pid 4930:tid 139674382092032] [client 54.86.72.53:62650]     from davidystephenson import app as application
[Thu Oct 23 12:14:50.984864 2014] [:error] [pid 4930:tid 139674382092032] [client 54.86.72.53:62650]   File "/var/www/davidystephenson/davidystephenson/__init__.py", line 4, in <module>
[Thu Oct 23 12:14:50.984926 2014] [:error] [pid 4930:tid 139674382092032] [client 54.86.72.53:62650]     import flask_bootstrap
[Thu Oct 23 12:14:50.984968 2014] [:error] [pid 4930:tid 139674382092032] [client 54.86.72.53:62650] ImportError: No module named flask_bootstrap

但是,我安装了flask_boostrap。 sudo pip3 installflask_boostrap 返回:

Requirement already satisfied (use --upgrade to upgrade): flask-bootstrap in /usr/local/lib/python3.4/dist-packages
Requirement already satisfied (use --upgrade to upgrade): Flask>=0.8 in /usr/local/lib/python3.4/dist-packages (from flask-bootstrap)
Requirement already satisfied (use --upgrade to upgrade): Werkzeug>=0.7 in /usr/local/lib/python3.4/dist-packages (from Flask>=0.8->flask-bootstrap)
Requirement already satisfied (use --upgrade to upgrade): Jinja2>=2.4 in /usr/local/lib/python3.4/dist-packages (from Flask>=0.8->flask-bootstrap)
Requirement already satisfied (use --upgrade to upgrade): itsdangerous>=0.21 in /usr/local/lib/python3.4/dist-packages (from Flask>=0.8->flask-bootstrap)
Requirement already satisfied (use --upgrade to upgrade): markupsafe in /usr/local/lib/python3.4/dist-packages (from Jinja2>=2.4->Flask>=0.8->flask-bootstrap)
Cleaning up...

直接运行 WSGI 文件时没有出现此类错误。我在应用程序的 __init__.py 中添加了一行,用于打印可用的 python3 模块的输出:

mods = sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])

flask_boostrap 似乎已安装。 python3 davidystephenson.wsgi 输出:

['chardet==2.0.1', 'colorama==0.2.5', 'command-not-found==0.3', 'flake8==2.2.2', 'flask-bootstrap==3.2.0.2', 'flask-mongoengine==0.7.1', 'flask-wtf==0.10.2', 'flask==0.10.1', 'html5lib==0.999', 'itsdangerous==0.24', 'jinja2==2.7.3', 'markupsafe==0.23', 'mccabe==0.2.1', 'mongoengine==0.8.7', 'pep8==1.5.7', 'pycurl==7.19.3', 'pyflakes==0.8.1', 'pygobject==3.12.0', 'pyinotify==0.9.4', 'pymongo==2.7.2', 'pyopenssl==0.13', 'python-apt==0.9.3.5', 'pyyaml==3.11', 'requests==2.2.1', 'six==1.5.2', 'ufw==0.34-rc-0ubuntu2', 'unattended-upgrades==0.1', 'urllib3==1.7.1', 'werkzeug==0.9.6', 'wtforms==2.0.1']

如果我删除导入flask_bootstrap,并且让页面仅返回一个字符串,则它会正确加载。因此,我使页面输出相同的可用 python 包列表,尽管 flask 仍然存在,但 flask_bootstrap 现在丢失了:

['argparse==1.2.1', 'chardet==2.0.1', 'colorama==0.2.5', 'configobj==4.7.2', 'flask==0.10.1', 'html5lib==0.999', 'iotop==0.6', 'itsdangerous==0.24', 'jinja2==2.7.3', 'markupsafe==0.23', 'pam==0.4.2', 'pyinotify==0.9.4', 'pyopenssl==0.13', 'pyserial==2.6', 'python-apt==0.9.3.5', 'python-debian==0.1.21-nmu2ubuntu2', 'requests==2.2.1', 'six==1.5.2', 'ssh-import-id==3.21', 'twisted-core==13.2.0', 'urllib3==1.7.1', 'werkzeug==0.9.6', 'wsgiref==0.1.2', 'zope.interface==4.0.5']

我在 /etc/apache2/sites-available 中有一个管理站点的配置文件:

<VirtualHost *:80>
    ServerName davidystephenson.com
    ServerAdmin davidystephenson.com
    WSGIDaemonProcess davidystephenson.com python path=davidystephenson.com:/usr/lib/python3.4/site-packages
    WSGIScriptAlias / /var/www/davidystephenson/davidystephenson.wsgi
    <Directory /var/www/davidystephenson/davidystephenson/>
        Order allow,deny
        Allow from all
    </Directory>
    Alias /static /var/www/davidystephenson/davidystephenson/static
    <Directory /var/www/davidystephenson/davidystephenson/static/>
        Order allow,deny
        Allow from all
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

我的 WSGI 文件内容如下:

usr/bin/python3
import sys
import logging

logging.basicConfig(stream=sys.stderr)
sys.path.insert(0, '/var/www/davidystephenson/')

from davidystephenson import app as application

我应该做什么?

最佳答案

@dirn提到它默认为系统 python,而不是 python3。由于您没有使用任何 virtualenv,因此所有包都应该位于 /usr/lib/python3.4/dist-packages 中的某个位置。

您可以使用它从您的口译员中找到它。

>>> import site; site.getsitepackages()

要告诉 wsgi,您必须将此路径添加到您的conf中WSGIScriptAlias之前。

WSGIPythonPath /var/www/davidystephenson/davidystephenson/:/usr/lib/python3/site-packages

注意:您还可以在守护进程模式下指定路径

WSGIDaemonProcess davidystephenson.com python-path=davidystephenson.com:/usr/lib/python3.4/site-packages

这是一个simple conf file 。我不知道你为什么不使用 virtualenv。但强烈建议使用它。

一些有用的资源:flask docs

关于python - WSGI无法导入本地安装的包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26533078/

相关文章:

python - 多个 Django Celery 任务试图保存到同一个对象并失败

python - 计算两个文本 block 之间百分比差异的算法

python - Python 3.10 的 Matplotlib 安装问题

django - 使用基本身份验证保护一些 Web 路径

python - 无法使用 pip 在 mac os 中安装 psycopg2

python - 你如何保护自己免受 python 垂直字符串列表中丢失逗号的影响?

python - 低特征环境的鲁棒定位

python-3.x - docker run 不工作 : no container created despite making container image

python - django UnreadablePostError : request data read error 错误

Django部署: Cutting Apache's Overhead