WSGIPythonPath应该指向我的virtualenv?

use*_*039 18 python django mod-wsgi wsgi

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

在阅读了六篇教程之后,我无法弄清楚我想将WSGIPythonPath指向的确切内容.我已经看到一些指向site-packages但有些已经是冒号:分隔列表.

Syntax error on line 1019 of /etc/httpd/conf/httpd.conf:
WSGIPythonPath cannot occur within <VirtualHost> section
Run Code Online (Sandbox Code Playgroud)

WSGIPythonPath应该指向我的virtualenv?

kay*_*kae 19

您收到错误是因为WSGIPythonPath指令无法在VirtualHost上下文中使用.您必须在主Apache配置文件中声明它.如果您仍想在VirtualHost上下文中指向virtualenv中的目录,请改用 Use WSGIDaemonProcess Directive,它有一个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>
Run Code Online (Sandbox Code Playgroud)

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

如果你在窗户上,请使用分号; 而不是完整的冒号.

我希望这有帮助.


tan*_*ius 5

tl; dr:使用WSGIDaemonProcess python-home=…不再建议使用WSGIPythonPathWSGIDaemonProcess python-path=…(使用!-path代替-home!)。

新旧方式

如@kaykae所述,WSGIPythonPath不能在VirtualHost上下文中使用,但WSGIDaemonProcess python-path=…等效。但是,尽管这仍然可以工作,但是它不再是mod_wsgi使用虚拟Python环境设置Apache的推荐方法:

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

更好的方式来指定Python的虚拟环境中的位置使用python-home该选项的WSGIDaemonProcess指令进行守护模式,或WSGIPythonHome用于嵌入模式指令。这些指定Python虚拟环境的方法已经可用,因为mod_wsgi 3.0和Linux发行版在相当长的一段时间内都没有发行过这样的旧版本的mod_wsgi。如果您使用的是较旧的方法,请更新您的配置。

(来源:WSGI文档:用户指南:虚拟环境

如何以新方式做

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

<IfModule mod_wsgi.c>
  WSGIDaemonProcess myapp1 user=user1 group=group1 threads=5 
python-home=/path/to/project/venv
</IfModule>
Run Code Online (Sandbox Code Playgroud)

请注意,这/path/to/project/venv是您环境的基本路径virtualenv。这将是venv您在其virtualenv venv上创建目录的子目录。

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