pip install mod_wsgi 在 vi​​rtualenv 中失败

Posted

技术标签:

【中文标题】pip install mod_wsgi 在 vi​​rtualenv 中失败【英文标题】:pip install mod_wsgi fails in virtualenv 【发布时间】:2017-03-26 15:58:13 【问题描述】:

我正在尝试在虚拟环境中的 mac os 10.12 上的 python 2.7.10 中使用 pip 安装 mod_wsgi。我打算在 Django 1.10.3 中使用它。 当我运行“pip install mod_wsgi”时,我得到以下输出:

Collecting mod_wsgi
Using cached mod_wsgi-4.5.7.tar.gz
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/private/var/folders/sf/kdqqs98d06326180mss7hggh0000gn/T/pip-build-hgA7s1/mod-wsgi/setup.py", line 247, in <module>
    APR_INCLUDES = get_apr_includes().split()
  File "/private/var/folders/sf/kdqqs98d06326180mss7hggh0000gn/T/pip-build-hgA7s1/mod-wsgi/setup.py", line 219, in get_apr_includes
    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 710, in __init__
    errread, errwrite)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1335, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/sf/kdqqs98d06326180mss7hggh0000gn/T/pip-build-hgA7s1/mod-wsgi/

我是 virtualenv 的新手,所以我可能只是缺少如何设置它的东西。我试过升级 pip,通过 pip 重新安装 setuptools 和 ez_setup。

【问题讨论】:

您是否安装了 Xcode 命令行工具? xcode-select --install 是否说它们在运行时已安装? 运行该命令提示我运行安装。我继续安装命令行工具。虽然在运行 pip install mod_wsgi 时我仍然遇到同样的问题。 程序/usr/sbin/apxs是否存在?你能在你系统的任何地方找到apxs吗?可以使用find / -name apxs。 Apple 在每次新的主要操作系统更新时都会中断 Apache 模块和 mod_wsgi 的安装,这一次看起来他们没有在正常位置安装 apxs 然后。它出现在我已更新到 Sierra 的备用笔记本电脑上。他们可能有必要安装完整的 Xcode 本身,但这并不是必须的。您的 Sierra 是全新安装还是从 Yosemite 升级而来。 /usr/sbin/apxs 确实存在并且 apxs 在终端中工作。我以前安装过xcode,但是当我这次启动它时,它必须重新安装。 (升级到 Sierra 可能是导致此问题的原因)即使在安装之后我也遇到了同样的错误。 【参考方案1】:

在 MacOS X Sierra 上安装 mod_wsgi 有两个问题。

第一个问题是 Apple 已经使他们提供的默认 Apache 安装在能够安装第三方 Apache 模块时完全无法使用。这建立在他们在以前的 MacOS X 版本中已经存在的障碍之上,这意味着您必须跳过障碍才能使其正常工作。

在这种情况下,问题在于 Apple 已从 Xcode 分发中删除了 apr-1-configapu-1-config 程序。这意味着当对存在的 Apache 配置进行某些类型的查询时,apxs 将失败。这是为 Apache 构建第三方模块所需的信息。在不知道头文件安装位置的情况下,Apache 模块的构建将失败。

鉴于 Apple 打破在每次操作系统更新中安装额外 Apache 模块的能力的历史,并且在操作系统的生命周期内从未修复它,因此需要变通方法,他们不太可能再次修复此问题。

在其他论坛中,解决此问题的一个建议是使用 brew 安装 APR 和 APU 软件包,然后将 apr-1-configapu-1-config 程序从这些程序符号链接到 apxs 正在寻找的位置。这对我来说看起来很容易出错,因为似乎模块可能会针对 brew 头文件进行编译,并且这些可能与操作系统 Apache 安装提供的库版本不匹配。这可能会导致崩溃。

因此,唯一有保证的解决方案是不使用随操作系统提供的 Apache 安装。

因此一种选择可能是使用 brew 安装 Apache 并使用 Apache 的 brew 安装(不仅仅是 brew 中的 APR 和 APU)。

如果使用pip install mod_wsgi 方法,另一种选择是首先使用为mod_wsgi 提供的pip 可安装Apache。

pip install -vvv mod_wsgi-httpd

只有在别无选择的情况下才应该使用它,并且如果可以的话,您应该始终使用系统 Apache。现在我们似乎别无选择。

这会将 Apache 安装到 Python 安装或虚拟环境中。这将需要一些时间,因为它将编译/安装 APR/APU/Apache 以及可能的其他所需库。我正在使用-vvv,所以你可以看到它正在编译,否则你可能会认为它已经挂起。

完成后运行pip install mod_wsgi

这仅在使用mod_wsgi-express 时有用。如果你想在操作系统 Apache 上使用编译好的 mod_wsgi,你不能使用这个,因为这样构建的模块将与操作系统 Apache 不兼容。

第二个问题是 MacOS X Sierra 更改了操作系统 API 以获取进程任务信息。这意味着 mod_wsgi 4.5.7 和更早版本无论如何都无法编译。 mod_wsgi 4.5.8 中有一个修复程序,或者如果需要,您可以使用 mod_wsgi github 存储库中的代码,直到 4.5.8 发布。


更新 1

在执行pip install mod_wsgi 时,设法在setup.py 中包含一个hack。这也将在 mod_wsgi 4.5.8 中。这意味着您仍然可以使用系统 Apache,而无需安装单独的系统,例如使用 pip install mod_wsgi-httpd。这不会解决与 for configure/make 安装 mod_wsgi 的方法类似的问题。

【讨论】:

通过 brew 安装 apache 似乎可以解决问题!感谢您提供如此有力而清晰的答案! 这在centos cpanel中也不起作用,有什么帮助吗? @xyz 创建一个新问题。不要将您的问题作为评论提出。 你在 CentOS 上。这个问题是关于 macOS 的一个特定问题。怎么可能是同一个问题?使用您的特定问题的确切详细信息创建一个新问题。

以上是关于pip install mod_wsgi 在 vi​​rtualenv 中失败的主要内容,如果未能解决你的问题,请参考以下文章

macos apache中mod_wsgi的配置

ImportError: No module named django.core.handlers.wsgi in install django mod_wsgi config on apache

在 Django/mod_wsgi 虚拟环境中配置 WSGIPythonHome 的问题

使用 mod_wsgi 和 django 运行 Apache

apache+mod_wsgi+flask 环境搭建

工作中涉及运维知识点的汇总