【问题标题】:How to install python3 virtualenv and mod_wsgi on RHEL?如何在 RHEL 上安装 python3 virtualenv 和 mod_wsgi?
【发布时间】:2019-10-06 19:54:26
【问题描述】:

在一个相当保守的系统 (RHEL) 上,我决定尝试一下,了解 virtualenv 并将我的 wsgi 应用程序从系统的默认 2.7 迁移到 3.6。有很多 Python3 版本可供选择:

$ yum search python3 | egrep '^python3[^-]+\.'
python34.x86_64 : Version 3 of the Python programming language aka Python 3000
python34u.x86_64 : Version 3 of the Python programming language aka Python 3000
python35u.x86_64 : Version 3.5 of the Python programming language
python36.x86_64 : Interpreter of the Python programming language
python36u.x86_64 : Interpreter of the Python programming language
$

我最终在 virtualenv 中安装了 python36。一切都在测试设置中正常工作,所以现在是时候安装正确的 apache 模块了。但是,virtualenv 和 mod_wsgi 似乎是互斥的,因为它们在 python3 中没有共同的版本:

$ yum search python | egrep '(virtualenv|mod_wsgi)'
python-virtualenv.noarch : Tool to create isolated Python environments
python3-virtualenv-doc.noarch : Documentation for python virtualenv
python34-virtualenv.noarch : Documentation for python virtualenv
python35u-mod_wsgi.x86_64 : A WSGI interface for Python web applications in
python35u-mod_wsgi-debuginfo.x86_64 : Debug information for package
                                    : python35u-mod_wsgi
python36-virtualenv.noarch : Documentation for python virtualenv
python36u-mod_wsgi.x86_64 : A WSGI interface for Python web applications in
python36u-mod_wsgi-debuginfo.x86_64 : Debug information for package
                                    : python36u-mod_wsgi
mod_wsgi.x86_64 : A WSGI interface for Python web applications in Apache
python-virtualenv-api.noarch : An API for virtualenv/pip
python-virtualenv-clone.noarch : Script to clone virtualenvs
python-virtualenvwrapper.noarch : Enhancements to virtualenv
$

请注意,mod_wsgi 软件包有“35u”和“36u”版本号,而 virtualenv 只有“34”和“36”。当我尝试同时安装任何一个时,我会收到大量的冲突错误消息。

当然python27(默认系统版本)还在,所以我尝试使用27的virtualenv创建一个python36环境,但也失败了:

$ virtualenv -p python3.6 env
Running virtualenv with interpreter /usr/bin/python3.6
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/virtualenv.py", line 8, in <module>
    import base64
  File "/usr/lib64/python3.6/base64.py", line 9, in <module>
    import re
  File "/usr/lib64/python3.6/re.py", line 142, in <module>
    class RegexFlag(enum.IntFlag):
AttributeError: module 'enum' has no attribute 'IntFlag'
$

RHEL 是我必须忍受的,因为这是在我公司的 Intranet 中的某些 VM 上运行的。我在家里运行 Debian,没有问题。我也不能使用不同的网络服务器,因为其他人在该服务器上有不同的应用程序(PHP)。

【问题讨论】:

    标签: python-3.x virtualenv rhel selinux


    【解决方案1】:

    好的,我会自己回答另一个问题。我发现在这个论坛上提问总是能激发我自己解决问题的能力。

    原来我只需要安装 python36u,它没有附带“virtualenv”可执行文件,而是带有“venv”模块,这样调用:

    python3.6 -m venv <env-dir>
    

    弄清楚这一点比让环境在 SELINUX 下工作要容易得多,因为安全策略不允许 Apache 在导入时加载所有共享对象。互联网智慧建议简单地禁用 SELINUX,这违背了它的目的,所以我深入挖掘并发现我必须修改环境中的共享库:

    find . -type f -name "*.so*" -or -name "*.so.*" | xargs sudo chcon -t shlib_t
    

    现在一切正常。

    【讨论】:

      【解决方案2】:

      在 Centos 7.7 中安装 python3-libselinux 解决了这个问题。

      sudo yum install python3-libselinux
      

      【讨论】:

        【解决方案3】:

        正如之前的回答所示,Red Hat 在 7.7 版本中将 Python 3 (.6) 添加到 rhel7。这可以通过使用 yum 安装 python3* 包来使用。那么就不需要使用EPEL的包了。

        在此之前,我曾经使用 Software Collections,它提供了 Python 和 Apache 2.4 的单独安装,尽管现在已经迁移到 Python 3.8,而 Python 3.8 并没有得到大量第三方库的良好支持。

        关于 selinux,我发现为每个 virtualenv 添加文件上下文等效规则效果很好,并且在面对重新标记或 virtualenv 更新时很健壮。只需将 virtualenv 的根目录设置为 / 即可。

        【讨论】:

          猜你喜欢
          • 2015-08-20
          • 2016-05-12
          • 2014-12-27
          • 1970-01-01
          • 2019-01-19
          • 1970-01-01
          • 1970-01-01
          • 2015-12-04
          • 2014-01-23
          相关资源
          最近更新 更多