【问题标题】:Where should WSGIPythonPath point in my virtualenv?WSGIPythonPath 应该在我的 virtualenv 中指向哪里?
【发布时间】:2015-03-06 03:12:51
【问题描述】:

我在虚拟环境中的lib 中有一个名为python2.7 的文件夹。

在阅读了半打教程之后,我无法弄清楚我想将 WSGIPythonPath 指向什么。我看到一些指向site-packages,但有些是冒号: 分隔的列表。

Syntax error on line 1019 of /etc/httpd/conf/httpd.conf:
WSGIPythonPath cannot occur within <VirtualHost> section

WSGIPythonPath 应该在我的 virtualenv 中指向哪里?

【问题讨论】:

  • 你的设置是什么?您是否尝试通过 Apache(通过 Mod_WSGI)运行 Web 应用程序?还是另一个网络服务器?您具体要在哪里设置“WSGIPythonPath”?
  • Apache 和 mod_wsgi,是的。尝试在&lt;VirtualHost *:80&gt;的apache配置文件中设置“WSGIPythonPath”
  • 你是在守护模式还是嵌入式模式下使用 Mod_WSGI?将您的 VirtualHost/Apache 配置条目与您的问题一起发布也可能会有所帮助。
  • 说实话,我不确定@Timusan。我会试着找出哪个
  • 基本上,现在,错误是Syntax error on line 1019 of /etc/httpd/conf/httpd.conf: WSGIPythonPath cannot occur within &lt;VirtualHost&gt; section

标签: python django mod-wsgi wsgi


【解决方案1】:

您收到错误是因为 WSGIPythonPath 指令不能在 VirtualHost 上下文中使用。您必须在主 Apache 配置文件中声明它。如果您仍想在 VirtualHost 上下文中指向您的 virtualenv 中的目录,请改用 WSGIDaemonProcess 指令,它有一个 python-path 选项供您声明相关的 python 目录。

例如:您的虚拟主机配置文件应如下所示:

<VirtualHost *:80>
ServerName example.com
CustomLog logs/example.com-access_log common
ErrorLog logs/example.com-error_log

WSGIDaemonProcess example.com python-path=/virtualenvpathto/site-packages:/pathto/exampleprojecthome
WSGIProcessGroup example.com

...
</VirtualHost>

完整的冒号 : 用于当您有多个 python 目录要添加到 $PYTHON_PATH 环境变量以便说 import example.foo 工作正常.在上面的示例中,有两个目录,它们可能或多或少取决于您如何设置项目。

如果您在 Windows 上,请使用分号;而不是完整的冒号。

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    tl;dr:使用WSGIDaemonProcess python-home=… 不再推荐使用WSGIPythonPathWSGIDaemonProcess python-path=…(使用-path 而不是-home!)的替代方案。

    新旧方式

    正如@kaykae 所述,WSGIPythonPath 不能在VirtualHost 上下文中使用,但WSGIDaemonProcess python-path=… 是等价的。然而,尽管这仍然有效,但不再推荐使用虚拟 Python 环境设置 Apache mod_wsgi

    请注意,以前的做法是这些设置 Python 模块搜索路径的方法 [即WSGIDaemonProcess …python-path=…WSGIPythonPath] 用于指定 Python 虚拟环境的位置。具体来说,它们用于添加 Python 虚拟环境的site-packages directory。你不应该那样做。

    指定 Python 虚拟环境位置的更好方法是使用 WSGIDaemonProcess 指令的 python-home 选项用于守护程序模式,或使用 WSGIPythonHome 指令用于嵌入式模式。从 mod_wsgi 3.0 开始,这些指定 Python 虚拟环境的方法就已经可用,并且 Linux 发行版已经有一段时间没有发布这么旧的 mod_wsgi 版本了。如果您使用的是旧方式,请更新您的配置。

    (来源:WSGI Docs: User Guides: Virtual Environments

    如何用新的方式来做

    您尝试在VirtualHost 上下文中配置mod_wsgi 的事实表明您使用的是“守护程序模式”配置版本。根据上面的引用,将 virtualenv 环境包含到 Python 路径中的推荐方法是在 VirtualHost 部分中像这样的部分(尽管它也可以在外部定义,因为它可以用 @ 引用987654341@ 您选择的守护进程组的标识符):

    <IfModule mod_wsgi.c>
      WSGIDaemonProcess myapp1 user=user1 group=group1 threads=5 
    python-home=/path/to/project/venv
    </IfModule>
    

    请注意,/path/to/project/venv 是您的virtualenv 环境的基本路径。这将是您调用virtualenv venv 来创建它的目录中的子目录venv

    还请注意,您可以在 Python 路径中添加其他路径,以使您的 import 语句适用于不通过 PIP 或类似方式管理的包。例如,您可以添加python-path=/path/to/project。只是不要使用这种机制来告诉 wsgi 整个 virtualenv 设置——因为他们介绍了python-home

    【讨论】:

      【解决方案3】:

      这里是官方文档:https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/modwsgi/#using-a-virtualenv

      使用虚拟环境¶

      如果您将项目的 Python 依赖项安装在 virtualenv 中, 你需要添加这个 virtualenv 的站点包的路径 目录到您的 Python 路径。为此,请添加一个额外的 WSGIPythonPath 指令的路径,多个路径分开 如果使用类 UNIX 系统,则使用冒号 (:),如果使用分号 (;),则 使用 Windows。如果目录路径的任何部分包含空格 字符,WSGIPythonPath 的完整参数字符串必须是 引用:

      > WSGIPythonPath
      > /path/to/mysite.com:/path/to/your/venv/lib/python3.X/site-packages
      

      确保你给你的 virtualenv 提供了正确的路径,并替换 python3.X 与正确的 Python 版本(例如 python3.4)。

      【讨论】:

      • 该链接未使用最佳做法。使用嵌入式模式时应使用WGIPythonHome 来指代虚拟环境,使用守护程序模式时应使用python-home 选项。见:blog.dscpl.com.au/2014/09/…
      猜你喜欢
      • 2010-12-06
      • 2021-10-23
      • 2014-05-04
      • 1970-01-01
      • 2015-03-11
      • 2017-01-16
      • 2020-10-14
      • 2017-03-30
      • 2017-05-11
      相关资源
      最近更新 更多