更改PYTHONHOME导致ImportError:没有名为site

时间:2016-09-16 13:27:56

标签: python centos mod-wsgi fabric importerror

我正在尝试通过mod_wsgi在Apache上部署Flask Web应用程序。我不能使用默认的Python环境,因为它是用UCS-2 Unicode而不是UCS-4编译的,我不能为这一个案例重新编译它。因此,一个虚拟环境。无论如何都会使用虚拟环境,但是这个错误意味着我无法使用默认的Python安装,只是将虚拟环境的模块添加到PYTHONPATH,否则会有让我完全避免当前的问题。

我找到了documentation for mod_wsgi to change which Python executable to use。但是,尝试这样做时,服务器无法正常工作。 /var/log/httpd/error_log ImportError: No module named site迅速充斥着httpd.conf行。

我已经检查了我在这里和其他地方找到的每个类似的问题,但还没有成功。实验表明,据我所知,在不激活虚拟环境的情况下更改PYTHONHOME时会出现问题 - 以及自动部署的工作方式(通过Fabric),据我所知,我无法激活虚拟环境环境。

Apache配置

我对该应用的当前WSGIPythonPath /path/to/dir/containing/wsgi/file/and/app:/path/to/virtualenv/lib:/path/to/virtualenv/lib/site-packages WSGIPythonHome /path/to/virtualenv WSGISocketPrefix /var/run/wsgi User user Group group <VirtualHost *> ServerName servername.generic.com DocumentRoot /path/to/dir/containing/wsgi/file/and/app/static_dev/ WSGIDaemonProcess appname user=user group=group threads=2 WSGIScriptAlias / /path/to/dir/containing/wsgi/file/and/app/app.wsgi <Directory /path/to/dir/containing/wsgi/file/and/app> WSGIProcessGroup appname WSGIApplicationGroup %{GLOBAL} Require all granted </Directory> </VirtualHost>

app.wsgi

从尝试失败中找到的数据

我知道错误不在我的raise Exception('tried to open the file')中,因为当我在最顶部添加行ImportError来检查时,现有的Exception一直在发生而不是新的ldd

我已通过mod_wsgi确认我的WSGIPythonHome /path/to/virtualenv/bin/版本适用于Python 2.7。

我尝试设置WSGIPythonHome /path/to/virtualenv/bin/pythonWSGIPythonHome,结果与当前状态相同。

我尝试省略app.wsgi指令,在这种情况下,它会加载WSGIPythonPath,但会在后面的导入中断,如上所述(我可以&#39; t就这样做。)

我尝试省略app.wsgi指令并将其留给WSGIDaemonProcess将事物添加到PYTHONPATH,结果与当前状态相同。

我尝试将路径设置作为参数放到WSGIPythonPath而不是site.py指令,结果与当前状态相同。

我已确认/path/to/virtualenv/lib中有.conf

我已经确认没有使用其他非应用程序特定的Apache site文件(默认设置,自动模块加载等)包含字符串&#34; WSGI&#34;,所以我不会&#39我认为这里有任何冲突。

如果我从命令行激活虚拟环境,我可以导入sudo systemctl start httpd.service而不会出错,只是为了测试它确实存在于环境中。但是,这是不够的,因为由于使用的部署工具,它需要从单个调用export PYTHONHOME=/path/to/virtualenv顺利启动,并且似乎不关心当前shell会话的venv。

如果从默认状态I ImportError: No module named site开始,尝试打开Python REPL会立即退出PYTHONHOME

如果我激活虚拟环境然后设置PYTHONHOME,我会收到相同的导入错误。

如果我激活虚拟环境并且不要触摸echo $PYTHONHOME(virtualenv)-bash-4.2$ python Python 2.7.8 (default, Aug 14 2014, 13:26:38) [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.prefix '/path/to/virtualenv' >>> sys.exec_prefix '/path/to/virtualenv' 会输出一个空行,并且Python REPL正常工作。在virtualenv中的Python REPL中:

PYTHONHOME

即使将export PYTHONHOME=:/path/to/virtualenv设置为相同的值也无效。

如果我尝试export PYTHONHOME=/path/to/virtualenv:prefix,只明确设置exec_prefixPYTHONHOME中的一个,则在任何一种情况下都会失败并导致相同的导入错误。

如果我激活虚拟环境并以后两种方式之一设置/,则未设置的显示默认为# Setting only exec_prefix (virtualenv)-bash-4.2$ export PYTHONHOME=:/path/to/virtualenv (virtualenv)-bash-4.2$ python Python 2.7.8 (default, Aug 14 2014, 13:26:38) [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.prefix '/' >>> sys.exec_prefix '/path/to/virtualenv' >>> quit() # Setting only prefix (.virtualenv)-bash-4.2$ export PYTHONHOME=/path/to/virtualenv: (.virtualenv)-bash-4.2$ python Python 2.7.8 (default, Aug 14 2014, 13:26:38) [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.prefix '/path/to/virtualenv' >>> sys.exec_prefix '/' 而不是通常的默认值,但Python REPL运行正常:

WSGIPythonHome

不幸的是,由于部署脚本并不关心激活什么环境,因此无法解决问题。试图以这种方式设置usr/bin/python没有任何区别。

我还注意到另一件事:virtualenv中的Python是 2.7.8 。在virtualenv(PYTHONHOME)之外运行的Python是 2.7.5 。我不知道 - 这会以某种方式影响WSGIPythonHome的设置吗?我希望不会 - 因为与仅在sys.path文件中设置app.wsgi相比,这似乎打败了使用/path/to/virtualenv/bin/python运行virtualenv的整个目的,从另一个文件开始的能力可执行 - 但我无法排除它,像我一样无能为力。

sys.real_prefix中的2.7.8 Python有/network-mounted-drive/sw/python/python-2.7.8 /network-mounted-drive/sw/python/python-2.7.5

我将部署更改为从-bash-4.2$ echo $PYTHONHOME /path/to/virtualenv -bash-4.2$ python ImportError: No module named site 构建,然后进行了更多测试。结果如下:

尝试启动httpd会产生与以前相同的导入错误。

将PYTHONHOME设置为虚拟环境的位置,然后运行python:

python

将PYTHONHOME设置为虚拟环境的位置,然后显式运行虚拟环境的python二进制文件(激活虚拟环境然后运行# In the directory just above the virtualenv -bash-4.2$ ./virtualenv/bin/python Python 2.7.5 (default, Mar 14 2016, 14:13:09) [GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.prefix '/path/to/virtualenv' >>> sys.exec_prefix '/path/to/virtualenv' >>> sys.real_prefix '/network-mounted-drive/sw/python/python-2.7.5 会得到相同的结果):

{{1}}

有没有人有任何想法?

1 个答案:

答案 0 :(得分:1)

解决方案:问题似乎是尝试使用由系统上本地python安装以外的其他东西构建的虚拟环境。

通过推送“部署VM上的本地python安装没有安装pip”的问题解决了链接到具有安装pip所需权限的人,因为没有尝试通过联网python安装的解决方法。

实际上使用从网络驱动器上的Python安装链接到mod_wsgi的虚拟环境的问题可能是不可解决的,或者至少我无法在相对于官僚解决方案的合理时间内弄清楚它。