同じuwsgi Emperorの下の異なるPythonバージョン?


9

私は、それぞれ異なるvirtualenvから特定のPythonアプリを提供するさまざまなVassalsでuwsgi Emperorを実行しています。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にインストールするだけで)、エラーが表示されなくなります。ただし、1つの皇帝に複数の異なるvirtualenvを支配してもらいたいので、それぞれに個別のuwsgiをインストールすることはできません。

Stackoverflowに関するこの回答によると、これを解決する正しい方法は、ロード可能なモジュールとして異なるPythonインタープリターでuwsgiをコンパイルすることです。このアプローチに取り組む前に、それぞれのVassalsが別のインタープリタープラグインを使用するように構成する方法を知りたいと思います。

現在、私は/etc/rc.localから開始され、次の設定で1つのEmperorを持っています。

[uwsgi]
uid = www-data
gid = www-data
master = true
emperor = /etc/uwsgi/vassals
daemonize = /var/log/uwsgi/emperor.log

それから私はこのようなiniファイルを備えたVassalsの束を持っています:

[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を1つだけ言ってもいいですか。

plugin = python3.4

そして別の:

plugin = python2.7

同じuwsgi EmperorでPython 2.7とPython 3 virtualenvを組み合わせる方法を教えてください。


あなたは、この段落に従うことができます:uwsgi-docs.readthedocs.org/en/latest/...を
ロベルト・

これは、uwsgi、paulox.net / 2017/04/04 / how-to-use-uwsgi-with-python3-6-in- ubuntuのpython 3.6プラグインを構築するのに役立ちました。使用するバージョンを指定できました各家臣は、必要なバージョンに応じて、 plugins=python3またはplugins=python36
Dfranc3373

回答:


9

まあ、私は正確に応答に圧倒されていなかったので、ここに私が自分で思いついた解決策があります:

まず、Python 3インタープリターで新しいvirtualenvを作成しました。

mkvirtualenv -p /usr/bin/python3 python3env

次に、Python 3インタープリターで自動的にコンパイルされるPypiからストックuwsgiをインストールしました。

pip install uwsgi

/etc/uwsgi-python3emperor.iniを含む構成ディレクトリと、vassal.iniを含むサブディレクトリvassals を作成しました。最後に、次の行を追加しました/etc/rc.local

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

これで、家臣にPython 3インタープリターを使用するuwsgi Emperorが実行されました。すでに実行されていて、Python 2.7インタープリターを使用している別のuwsgi Emperorに干渉しません。

ドキュメントで説明されているプラ​​ガブルインタープリターアーキテクチャを使用していないため、最適ではないことを知っています(robertoに感謝します。見過ごす方法がわかりません)。しかし、それは問題なく実行され、多くの製品アプリを提供している既存のuwsgiインストールに手を加える必要はありませんでした。


グローバルuwsgiインストールで苦労した後、私はこのアプローチを採用しました。いい... +1
nicorellius 2016年

@hedgie:あなたは神です!「ありがとう!」だけのコメントがあってはいけません。(すでに賛成)、しかしあなたはそれに値する。単一のPythonプラグインを構築するためのリンクは、ローカライズされたUbuntuでは動作しませんでしたが、仮想環境にインストールされたuwsgiを起動すると、正しいpythonバージョン(./venv/bin/uwsgi --python-version)で実行されます。パーフェクト!
taffit

私はpy 2.7.14のvirtualenvとpy 2.7.5にグローバルにインストールされたuwsgiで同じ問題を抱えています。まだすべてのpython 2.7であるにもかかわらずインポートサイトエラーが発生する
radtek

3

OSXの下で私はこのように作りました。私のシステムのすべてのuwsgiをアンインストールしました(bipからの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プロジェクトを同時に実行できます


多くの解決策がありますが、これは私が実行していた問題を本当に解決uwsgiしましたpython 3.6
Evhz

0

別の可能な解決策は、システム全体の「皇帝」を再利用し、家臣のみを新しいバージョンで置き換えることです。これにより、の下に新しいフォルダを作成し/etcたり、に新しいサービスを起動したりする必要がなくなりますrc.local

  1. uwsgivia pipviavirtにインストールします。
  2. /etc/uwsgi/apps-enabled/your-app.ini次のように編集します。

    • plugins=...行を削除します(pip-compiled uwsgiはプラグインをサポートしていないため)。
    • 次の行を追加します。

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

      これにより、uWSGI皇帝が自分のuwsgiバイナリを家臣として起動します。

  3. 皇帝にアプリをリロードしますservice uwsgi restart your-app

最後のステップで、サーバーの再起動に失敗したことが報告されました。

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

ただし、実際には、新しい家臣は他のすべてのアプリと同様に正常に起動します。これをデバッグする時間はありませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.