【问题标题】:How do I use a conda environment with mod_wsgi?如何使用带有 mod_wsgi 的 conda 环境?
【发布时间】:2015-08-15 08:58:39
【问题描述】:

我的第一篇文章,我是 Python 和 Apache 的新手,所以请放轻松。我在 conda 环境中有一个 Python Web 应用程序,可以使用 Flask 很好地提供内容。现在我需要使用 Apache 而不是 Flask 来提供所有服务。我可以让 Apache 使用 mod_wsgi 运行 Python,但只能使用 virtualenv。我尝试使用 Anaconda 安装 virtualenv,但收到警告说这种设置不受支持且不推荐。所以我的问题是:

如何设置 Apache 以在 conda 环境中运行我的应用程序?

Here,有一节是关于使用虚拟环境的,它说我需要在我的 wsgi 文件中输入一行,显示在哪里可以找到 activate_this.py。 virtualenv 虚拟环境有 activate_this.py,但 conda 环境没有。似乎没有正确的激活虚拟环境的说明,我的浏览器中出现错误 500,并且我的 httpd error_log 中出现“导入错误:没有名为 flask 的模块”。

这是在我的 httpd.conf 文件中:

<VirtualHost *:80>
     DocumentRoot /var/www
     WSGIScriptAlias / var/www/tsm.wsgi
     <Directory /var/www/tsm>
     Order allow,deny
     Allow from all
     </Directory>
</VirtualHost>

这里是 tsm.wsgi:

import sys
import site
site.addsitedir('~/.conda/envs/tsm/lib/python2.7/site-packages')
sys.path.insert(0, '/var/www/tsm/server/time_series_machine')
sys.stdout = sys.stderr
from app import app as application

有什么想法吗?感谢您提供的任何帮助。

【问题讨论】:

    标签: python apache mod-wsgi anaconda conda


    【解决方案1】:

    我迟到了,但我遇到了同样的问题。对于它的价值,我不必重新编译任何东西,并且能够通过使用系统安装的 mod_wsgi 在我的 VirtualHost 配置中包含类似的东西来让它工作:

    WSGIDaemonProcess mysite python-path=/path/to/anaconda2/lib/python2.7/site-packages
    

    请注意,这指向site-packages 目录。

    【讨论】:

    • 这里指的是哪个文件?
    【解决方案2】:

    要添加到@dino 的答案,您还可以将mod_wsgi 安装到您的根 conda 环境中:

    # Instal `mod_wsgi`
    $ pip install mod_wsgi
    
    # Find the full path to installed `mod_wsgi`
    $ which mod_wsgi-express
    
    # Install and register the `mod_wsgi` module with Apache
    $ sudo /full/path/to/installed/mod_wsgi-express install-module
    

    然后您可以为多个站点创建 conda 环境:

    # Create 3 conda environments
    conda create -n mysite1 python django
    conda create -n mysite2 python django
    conda create -n mysite3 python django
    

    并在Apache站点配置文件中设置WSGIDaemonProcess为每个站点使用合适的环境:

    # /etc/apache2/sites-enabled/mysite1.conf
    WSGIDaemonProcess mysite1 python-path=/path/to/anaconda3/envs/mysite1/lib/python3.5/site-packages
    
    # /etc/apache2/sites-enabled/mysite2.conf
    WSGIDaemonProcess mysite2 python-path=/path/to/anaconda3/envs/mysite2/lib/python3.5/site-packages
    
    # /etc/apache2/sites-enabled/mysite3.conf
    WSGIDaemonProcess mysite3 python-path=/path/to/anaconda3/envs/mysite3/lib/python3.5/site-packages
    

    【讨论】:

    • @graham-dumpleton 你能解释一下编辑吗?我在本地机器上尝试过,我的 apache 日志文件中出现错误,提示 ImportError: No module named 'django'
    • 使用python-path 引用site-packages 不是最佳做法。您应该使用 python-home 选项来引用 Python 虚拟环境的顶部。引用site-packages 可以隐藏各种问题,例如您的 mod_wsgi 实际上是为不同的 Python 版本或安装编译的。 blog.dscpl.com.au/2014/09/…
    • /etc/apache2/sites-enabled/文件夹内的站点配置文件(见代码sn-ps中的cmets)。
    【解决方案3】:

    您的 mod_wsgi 需要针对 Anaconda Python 而不是您的系统 Python 进行编译。换句话说,您不能使用系统提供的 mod_wsgi 包,但需要自己编译。然后按照上面所说的:

    即使用守护程序模式并使用python-home 选项到WSGIDaemonProcess

    请注意,有报道称 Anaconda Python 在某些方面存在问题,无法与想要嵌入 Python 的系统一起使用。所以可能无论如何都行不通。

    顺便说一句,无论如何,你不能在你的 WSGI 脚本文件的路径中使用'~'。它不会扩展为主目录。但是,按照那个帖子,你就不需要那个了。

    【讨论】:

    • 谢谢!我认为...我认为这解决了它。我现在遇到了其他错误,但我想我有一个在 conda 环境中使用 mod_wsgi 的 Apache 服务器。我 yum 删除了 mod_wsgi,下载了源代码,源代码激活了我的 conda 环境,使用“python setup.py install”编译和安装,然后我在 0.0.0.0:8080 上使用 mod_wsgi-express start-server 启动了一个服务器。我可以看到那里的页面......瓶中的蛇?但是现在当我尝试加载特定的 .py 文件时,我收到了这个错误:
    • 抱歉,按 Enter 键而不是按 shift-enter 键,然后花了太长时间来更正我的回复。无论如何,我认为它有效;我现在在尝试运行一个简单的 helloWorld.py 时遇到了一个不同的错误,我现在会处理它,如果我无法弄清楚,稍后再提交另一个问题。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 2018-04-26
    • 2017-07-10
    • 2018-09-15
    相关资源
    最近更新 更多