AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 633437
Accepted
Jaap Joris Vens
Jaap Joris Vens
Asked: 2014-10-04 13:02:54 +0800 CST2014-10-04 13:02:54 +0800 CST 2014-10-04 13:02:54 +0800 CST

同一个uwsgi Emperor下的不同Python版本?

  • 772

我正在运行一个带有各种 Vassal 的 uwsgi Emperor,每个 Vassal 都为来自不同 virtualenv 的特定 Python 应用程序提供服务。由于 uwsgi 是使用它自己的 Python 2.7 解释器编译的,因此尝试在其中使用带有 Python 3 的 virtualenv 会在 vassal.log 中产生以下错误:

ImportError: No module named site

我相信这个错误的根源是 uwsgi 正在使用其内置的 Python 2.7 解释器,而它运行的 virtualenv 目录仅支持 Python 3 解释器。实际上,当我使用另一个 uwsgi(只需将其安装pip install uwsgi在同一个 virtualenv 中)时,错误就会消失。但是,我希望一个皇帝统治几个不同的虚拟环境,所以在每个虚拟环境中安装一个单独的 uwsgi 不是一种选择。

根据Stackoverflow 上的这个答案,解决这个问题的正确方法是使用不同的 Python 解释器编译 uwsgi 作为可加载模块。在我采用这种方法之前,我想知道如何将我的 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文件的Vassal:

[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 的调整版本没有问题,但我想知道我必须在配置中更改什么才能实际使用这些单独的解释器。我可以说一个vassal.ini:

plugin = python3.4

在另一个:

plugin = python2.7

?

请帮我弄清楚如何在同一个 uwsgi Emperor 下结合 Python 2.7 和 Python 3 virtualenvs。

python
  • 3 3 个回答
  • 14858 Views

3 个回答

  • Voted
  1. Best Answer
    Jaap Joris Vens
    2014-10-06T00:20:14+08:002014-10-06T00:20:14+08:00

    好吧,由于我并没有完全被回复所淹没,所以这是我自己想出的解决方案:

    首先,我使用 Python 3 解释器创建了一个新的 virtualenv:

    mkvirtualenv -p /usr/bin/python3 python3env
    

    然后我从 Pypi 安装了股票 uwsgi,它使用 Python 3 解释器自动编译:

    pip install uwsgi
    

    我创建了一个包含 Emperor.ini 的配置目录/etc/uwsgi-python3和一个包含 vassal.ini 的子目录 vassals。最后,我将以下行添加到/etc/rc.local

    /home/user/.virtualenvs/python3env/bin/uwsgi --ini /etc/uwsgi-python3/emperor.ini
    

    现在有一个 uwsgi Emperor 正在运行,它使用 Python 3 解释器作为它的附庸。它不会干扰另一个已经在运行并使用 Python 2.7 解释器的 uwsgi Emperor。

    我知道这不是最优的,因为我没有使用文档中解释的可插入解释器架构(感谢 roberto!我不知道我怎么能忽略这一点)。但是,它运行完美,我不必碰我现有的为大量生产应用程序提供服务的 uwsgi 安装。

    • 10
  2. Giovanni Brescia
    2018-06-15T22:46:07+08:002018-06-15T22:46:07+08:00

    在osx下我是这样制作的。我卸载了我系统上的所有 uwsgi(来自 pip 的 brew 等)。

    之后我在 /usr/local 下下载了源代码

    wget https://projects.unbit.it/downloads/uwsgi-latest.tar.gz
    tar zxvf uwsgi-latest.tar.gz
    

    后

    cd uwsgi-2.0.17
    make PROFILE=nolang
    

    通过这种方式,我创建了一个没有 python 插件的可执行文件。

    之后,我为系统上的每个版本制作了每个插件:

    PYTHON=python3.6 ./uwsgi --build-plugin "plugins/python python36"
    PYTHON=python2.7 ./uwsgi --build-plugin "plugins/python python27"
    PYTHON=python2.6 ./uwsgi --build-plugin "plugins/python python26"
    

    现在我有 3 个插件。

    在我的皇帝的ini文件中,我为每个文件指定了插件目录和插件版本

    [uwsgi]
    plugins-dir = /usr/local/uwsgi-2.0.17
    plugin = python36
    
    [uwsgi]
    plugins-dir = /usr/local/uwsgi-2.0.17
    plugin = python27
    
    [uwsgi]
    plugins-dir = /usr/local/uwsgi-2.0.17
    plugin = python26
    
    ...
    

    我在 /usr/local 文件夹中符号链接了 uwsgi 二进制文件

    ln -s /usr/local/uwsgi-2.0.17/uwsgi /usr/local/bin/uwsgi
    

    而在跑完皇帝之后

    uwsgi --emperor /PATH/TO/INI/FILES/FOLDER/
    

    瞧,现在我可以同时运行 python26、python27 和 python36 项目

    • 4
  3. KT.
    2018-01-18T04:00:47+08:002018-01-18T04:00:47+08:00

    另一种可能的解决方案是重用系统范围的“皇帝”,并且只用新版本替换附庸。这样您就不需要/etc在rc.local.

    1. uwsgi通过安装pip到 virtualenv 中。
    2. 编辑/etc/uwsgi/apps-enabled/your-app.ini如下:

      • 删除该plugins=...行(因为 pip-compileduwsgi不支持插件)。
      • 添加行:

        unprivileged-binary-patch = /path/to/your/venv/bin/uwsgi
        

        这将迫使 uWSGI 皇帝启动您自己的uwsgi二进制文件作为附庸。

    3. 在 Emperor 中重新加载您的应用程序service uwsgi restart your-app。

    最后一步不知为何报告重启服务器失败:

     * Starting app server(s) uwsgi
       ...fail!
    

    然而,实际上,新的vassal 和所有其他应用程序一样都很好。我没有时间调试这个。

    • 2

相关问题

  • 在 cygwin/XP 下安装完整 Python 的最佳方式?

  • Mac OS X:从 python 脚本中更改 $PATH

  • 可以使用 easy_install 和 bdist_rpm 安装吗?

  • 我可以“注册”python 脚本以在 Windows 上执行吗?

  • 如何使用脚本远程重启 Windows 服务?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve