我正在运行一个uwsgi皇帝与各种各样的封臣,每个服务从不同的virtualenv特定的Python应用程序。 由于uwsgi是用它自己的Python 2.7解释器编译的,因此试图在其中使用带有Python 3的virtualenv在vassal.log中产生以下错误:
ImportError: No module named site
我相信这个错误的根源在于uwsgi正在使用其内置的Python 2.7解释器,而它所运行的virtualenv目录仅支持Python 3解释器。 事实上,当我使用另一个uwsgi(只需在同一个virtualenv中使用pip install uwsgi安装它),错误消失。 不过,我想要一个皇帝统治几个不同的virtualenvs,所以每个安装一个单独的uwsgi不是一个选项。
根据Stackoverflow上的这个答案 ,解决这个问题的正确方法是用不同的Python解释器编译uwsgi作为可加载模块。 在我采用这种方法之前,我想知道如何configuration我的Vassals以使用另一个解释器插件。
现在我有一个从我的/etc/rc.local启动的Emperor,其设置如下:
[uwsgi] uid = www-data gid = www-data master = true emperor = /etc/uwsgi/vassals daemonize = /var/log/uwsgi/emperor.log
然后我有一堆像这样的ini文件的封臣:
[uwsgi] master = false single-interpreter = true socket = /tmp/%n.sock virtualenv = /home/user/.virtualenvs/djangoproject chdir = /home/user/djangoproject wsgi-file = project/wsgi.py logto = /var/log/uwsgi/%n.log
我用几个解释器插件编译uwsgi的一个调整版本没有问题,但是我想知道在configuration中我必须改变什么来实际使用这些单独的解释器。 我可以只说一个vassal.ini:
plugin = python3.4
另一个:
plugin = python2.7
?
请帮我弄清楚如何在同一个uwsgi Emperor下面结合Python 2.7和Python 3 virtualenvs。
那么,因为我没有完全被反应所压倒,所以这是我自己提出的解决scheme:
首先,我用Python 3解释器创build了一个新的virtualenv:
mkvirtualenv -p /usr/bin/python3 python3env
然后,我从Pypi安装了股票uwsgi,它使用Python 3解释器自动编译:
pip install uwsgi
我创build了一个configuration目录/etc/uwsgi-python3 ,其中包含emperor.ini和子目录vassals,其中包含vassal.ini。 最后,我将下面一行添加到/etc/rc.local
/home/user/.virtualenvs/python3env/bin/uwsgi --ini /etc/uwsgi-python3/emperor.ini
现在有一个使用Python 3解释器来parsing其封套的uwsgi Emperor。 它不会干扰已经运行并使用Python 2.7解释器的另一个uwsgi Emperor。
我知道这不是最优的,因为我没有使用在文档中解释的可插拔解释器体系结构(感谢roberto!我不知道我怎么可能忽略这个)。 但是,它运行得非常完美,而且我不必触摸现有的uwsgi安装程序,这些安装程序正在为大量生产应用程序提供服务。