我正在尝试通过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),据我所知,我无法激活虚拟环境环境。
我对该应用的当前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/python
和WSGIPythonHome
,结果与当前状态相同。
我尝试省略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_prefix
和PYTHONHOME
中的一个,则在任何一种情况下都会失败并导致相同的导入错误。
如果我激活虚拟环境并以后两种方式之一设置/
,则未设置的显示默认为# 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}}
有没有人有任何想法?
答案 0 :(得分:1)
解决方案:问题似乎是尝试使用由系统上本地python安装以外的其他东西构建的虚拟环境。
通过推送“部署VM上的本地python安装没有安装pip”的问题解决了链接到具有安装pip所需权限的人,因为没有尝试通过联网python安装的解决方法。
实际上使用从网络驱动器上的Python安装链接到mod_wsgi的虚拟环境的问题可能是不可解决的,或者至少我无法在相对于官僚解决方案的合理时间内弄清楚它。