如何在RHEL上安装python3 virtualenv和mod_wsgi?

时间:2019-05-20 12:27:48

标签: python-3.x virtualenv rhel selinux

在一个比较保守的系统(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。另外,我不能使用其他Web服务器,因为其他人在该服务器上具有不同的应用程序(PHP)。

3 个答案:

答案 0 :(得分:0)

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

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

python3.6 -m venv <env-dir>

解决这个问题比让环境在SELINUX下工作要容易得多,因为安全策略不允许Apache在导入时加载所有共享对象。 Internet上的智慧建议禁用SELINUX,这违背了它的目的,因此我更深入地研究发现,我不得不修改环境中的共享库:

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

现在一切正常。

答案 1 :(得分:0)

在Centos 7.7中安装python3-libselinux可解决此问题。

sudo yum install python3-libselinux

答案 2 :(得分:0)

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

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

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